拉姆达表达式的一些常用知识
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);
}
}