拉姆达表达式的一些常用知识
1、Distinct()方法的使用。
通常我们使用 list.Distinc()的时候,默认的是使用 public static IEnumerable
如果想根据某个属性来去重的话,就需要拓展一下 public static IEnumerable
如下代码。
拓展类:
public class MyEqualityComparer: IEqualityComparer { private Func keyFunc; private IEqualityComparer comparer; public MyEqualityComparer(Func keyFunc, IEqualityComparer comparer) { this.keyFunc = keyFunc; this.comparer = comparer; } public MyEqualityComparer(Func keyFunc) : this(keyFunc, EqualityComparer .Default) { } public bool Equals(T x, T y) { return comparer.Equals(keyFunc(x), keyFunc(y)); } public int GetHashCode(T obj) { return comparer.GetHashCode(keyFunc(obj)); } }
拓展方法:
public static class ExtensionsMethod { ////// 拓展distinct /// ///源类型 ///委托返回类型(根据V类型,排除重复项) /// 拓展源 /// 委托(执行操作) ///public static IEnumerable Distinct (this IEnumerable source, Func func) { return source.Distinct(new MyEqualityComparer (func)); } }
方法使用:
#region List Distinct 去重 var list=new List() { new Student(){Age = "18",Name = "zhangsan"}, new Student(){Age = "18",Name = "lisi"}, new Student(){Age = "19",Name = "zhangsan"}, }; var listDistinct = list.Distinct(); var listMyDistinct = list.Distinct(c => new {c.Name}).ToList(); #endregion
2、System.Linq.Expressions.Expression的使用。
有个集合,我们想把几个lambda表达式合并起来使用的话,这个方法就很有用
如下代码:
System.Linq.Expressions.Expression> pre = s => false; System.Linq.Expressions.Expression > expression = e => false; expression.And(c => c != ""); List preList = new List () { "huage", "zhangsan", "lisi", "wangwu", "zhaolu", "tianqi" }; preList.Remove(null); preList.Remove("huage"); if (preList.Contains("zhangsan")) { pre = pre.Or(c => c.Contains("zhangsan")); } if (preList.Contains("wangwu")) { pre = pre.Or(c => c.Contains("wangwu")); } var listStra = preList.Where(pre.Compile()).ToList();
常用的拓展方法
public static class ExtensionsMethod { public static Expression> True () { return f => true; } public static Expression > False () { return f => false; } public static Expression > Or (this Expression > expression1, Expression > expression2) { var invokedExpression = Expression.Invoke(expression2, expression1.Parameters .Cast ()); return Expression.Lambda >(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters); } public static Expression > And (this Expression > expression1, Expression > expression2) { var invokedExpression = Expression.Invoke(expression2, expression1.Parameters .Cast ()); return Expression.Lambda >(Expression.And(expression1.Body, invokedExpression), expression1.Parameters); } }