其他条款对LINQ,凡
问题描述:
在我C# linq-Querys
我经常使用类似(在我的应用程序的规则)的表达式:其他条款对LINQ,凡
.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16)
我可以写这篇文章像CustomExpression:
.MyIdCheck()
或者有没有更好的方法来封装规则?
答
你可以声明一个扩展方法类型IEnumrable<T>
:
public static class MyExtensions
{
public IEnumerable<T> MyIdCheck(this IEnumerable<T> input)
{
return input.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16);
}
}
在地方的T
你必须把你的对象的类型。
然后,您可以在使用Where
时使用它。
var result = input.MyIdCheck();
另一种方法是将定义一个数组,包含您所寻找的IDS,象下面这样:
var ids = new int[] { 1, 12, 16 };
然后你检查它会像下面:
var result = input.Where(x=>ids.Contains(x));
答
您可以使用一种方法:
private bool MyIdCheck(int x) {
return x.Id == 1 || x.Id == 12 || x.Id == 16
}
// ...
.Where(x => MyIdCheck(x.Id));
答
你可以做这样的事情:
var acceptableIds = new List<int>() {1, 12, 16};
然后使用包含列表功能。
a.Where(x => acceptableIds.Contains(x.Id))
答
您可以通过一个名为方法出它使lambda表达式可重复使用:
public static bool MyIdCheck(MyClass x) {
return x.Id == 1 || x.Id == 12 || x.Id == 16;
}
现在你可以使用方法名,你会使用lambda表达式:
.Where(MyIdCheck)
答
您可以创建一个自定义的Func:
Func<MyClass, bool> MyIdCheck = x => x.Id == 1 || x.Id == 12 || x.Id == 16;
,并调用它像:
var allMyClass = new List<MyClass>();
Console.WriteLine(allMyClass.Where(MyIdCheck));
或者添加到您的类:
public static IEnumerable<MyClass> MyIdCheck(IEnumerable<MyClass> myClass)
{
return myClass.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16);
}
,并调用它像:
MyClass.MyIdCheck(allMyClass);
'。凡(X =>新的[] { 1,12,16} .Contains(x))'。新** [1,12,16]的** HashSet **会更好。 – 2014-12-07 22:25:53
答案很大程度上取决于你正在处理的LINQ类型。一个SQL后端使它完全不同。 – 2014-12-07 22:35:25