(精華)2020年8月11日 C#基礎知識點 表示式目錄樹擴充套件(And,Or,Not)
#region 表示式連結
{
Expression<Func<People, bool>> lambda1 = x => x.Age > 5;
Expression<Func<People, bool>> lambda2 = x => x.Id > 5;
Expression<Func<People, bool>> lambda3 = lambda1.And(lambda2);
Expression<Func<People, bool>> lambda4 = lambda1.Or(lambda2);
Expression<Func<People, bool>> lambda5 = lambda1.Not();
Do1(lambda3);
Do1(lambda4);
Do1(lambda5);
}
#endregion
#region PrivateMethod
private static void Do1(Func<People, bool> func)
{
List<People> people = new List<People>();
people.Where(func);
}
private static void Do1(Expression<Func<People, bool>> func)
{
List<People> people = new List<People>()
{
new People(){Id=4,Name="123",Age=4},
new People(){Id=5,Name="234",Age=5},
new People(){Id=6,Name="345",Age=6},
};
List<People> peopleList = people.Where(func.Compile()).ToList();
}
private static IQueryable<People> GetQueryable(Expression<Func<People, bool>> func)
{
List<People> people = new List<People>()
{
new People(){Id=4,Name="123",Age=4},
new People(){Id=5,Name="234",Age=5},
new People(){Id=6,Name="345",Age=6},
};
return people.AsQueryable<People>().Where(func);
}
#endregion
/// <summary>
/// 合併表示式 And Or Not擴充套件
/// </summary>
public static class ExpressionExtend
{
/// <summary>
/// 合併表示式 expr1 AND expr2
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="expr1"></param>
/// <param name="expr2"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
//return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
var left = visitor.Replace(expr1.Body);
var right = visitor.Replace(expr2.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
/// <summary>
/// 合併表示式 expr1 or expr2
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="expr1"></param>
/// <param name="expr2"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
var left = visitor.Replace(expr1.Body);
var right = visitor.Replace(expr2.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expr)
{
var candidateExpr = expr.Parameters[0];
var body = Expression.Not(expr.Body);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
}
相關文章
- (精華)2020年8月11日 C#基礎知識點 解析表示式目錄樹實現替換C#
- 計算機基礎知識擴充套件篇計算機套件
- 擴充套件表示式套件
- 表示式目錄樹
- 『忘了再學』Shell基礎 — 25、擴充套件正規表示式套件
- 正規表示式基礎知識
- C#-表示式目錄樹C#
- 正規表示式(一) 基礎知識
- 05.表示式目錄樹ExpressionExpress
- iOS 基礎知識學習目錄索引iOS索引
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件
- (精華)2020年6月26日 C#類庫 DataTable(擴充套件方法)C#套件
- php知識點目錄PHP
- 正規表示式基礎知識總結
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 線段樹擴充套件套件
- 基礎的python知識3(布林表示式)Python
- corejava基礎知識(2)-介面和lambda表示式Java
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 正規表示式知識點
- (精華)2020年6月28日 Canvas 基礎知識Canvas
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- Shell—擴充套件正規表示式(awk、sort、uniq、tr工具)套件
- c# 表示式樹(一)C#
- SpringBoot擴充套件點EnvironmentPostProcessorSpring Boot套件
- Kotlin擴充套件函式Kotlin套件函式
- C#|.net core 基礎 - 擴充套件陣列新增刪除效能最好的方法C#套件陣列
- JavaWeb基礎知識點JavaWeb
- java基礎知識點Java
- 前端面試知識點目錄整理前端面試
- 使用nub恢復資料庫的知識擴充套件資料庫套件
- Js基礎知識3-字串、正規表示式全解JS字串
- c# ExpandoObject動態擴充套件物件C#Object套件物件
- C#中的表示式樹C#
- Android技能樹 — 樹基礎知識小結(一)Android
- 擴充套件認知的視野套件
- 資料中心基礎設施是應該縱向擴充套件還是橫向擴充套件?套件