在我C# linq-Querys
我經常使用類似(在我的應用程序的規則)的表達式:其他條款對LINQ,凡
.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16)
我可以寫這篇文章像CustomExpression:
.MyIdCheck()
或者有沒有更好的方法來封裝規則?
在我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