(精華)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#
- 機器學習面試基礎知識 & 擴充套件-01機器學習面試套件
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件
- (精華)2020年6月26日 C#類庫 DataTable(擴充套件方法)C#套件
- 計算機基礎知識擴充套件篇計算機套件
- (精華)2020年6月28日 Canvas 基礎知識Canvas
- 擴充套件表示式套件
- 擴充套件知識套件
- 表示式目錄樹
- 『忘了再學』Shell基礎 — 25、擴充套件正規表示式套件
- Kotlin基礎 — 擴充套件函式Kotlin套件函式
- C#基礎系列:擴充套件方法的使用C#套件
- 正規表示式基礎知識
- C#-表示式目錄樹C#
- linux擴充套件根目錄大小Linux套件
- 正規表示式(一) 基礎知識
- 05.表示式目錄樹ExpressionExpress
- iOS 基礎知識學習目錄索引iOS索引
- php知識點目錄PHP
- 正規表示式基礎知識總結
- oracle小知識點8--10g/11g 日誌目錄Oracle
- c#中正規表示式 和 集合 的知識點C#
- (精華)2020年7月3日 JavaScript高階篇 ES6(物件的擴充套件方法)JavaScript物件套件
- JAVA基礎知識精華總結(一)Java
- JAVA基礎知識精華總結(二)Java
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 線段樹擴充套件套件
- corejava基礎知識(2)-介面和lambda表示式Java
- Android知識點目錄Android
- (精華)2020年7月3日 JavaScript高階篇 ES6(陣列的擴充套件方法)JavaScript陣列套件
- 正規表示式知識點
- rman基礎知識補充
- 知識庫(2)-使用Windows OpenGL擴充套件機制來訪問OpenGL擴充套件 (轉)Windows套件
- 基礎的python知識3(布林表示式)Python
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- JavaSE基礎:擴充套件Java 8 日期操作Java套件
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- java基礎知識點Java