[英]How to apply multiple search patterns with Directory.EnumerateFiles()?
[英]Apply search patterns in Where method?
我正在嘗試反向Select
方法:根據他們的Id
投射大量項目,我在考慮Where
所以我會做這樣的事情:
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)
但如果我有一長串Id,或者我想按Title
搜索,那將是非常痛苦的代碼,所以有沒有辦法根據一組值檢索項目列表(如SQL: WHERE id IN..
)
string[] bookNames = { "BookName1", "BookName2" };
db.Books.Where(b => bookNames.Contains(b.Name));
上面列出的解決方案都有效--Dispersia的LINQ查詢實際上非常好。
還有一個可能需要記住它的價值:你總是可以編寫自己的LINQ類擴展方法。 這是我為了他們的價值而組成的一對夫婦。 (我並不認為這些實際上比其他解決方案更好,或者你一定想要使用它們 - 如果你想在將來做類似的事情,它們只需要記住以供參考) 。
請注意,如果您願意,編譯器甚至允許您將它們添加到System.Linq命名空間,但您肯定可以爭論這是否是一個好的做法。
namespace System.Linq
{
public static class LinqExtensions
{
// This one's more or less like "Contains" except for the "params" part
// Example: book.Id.In(1, 2, 3, 4, 5)
public static bool In<T>(this T item, params T[] list)
{
foreach (T args in list)
{
if (args.Equals(item))
{
return true;
}
}
return false;
}
// Same idea as above except using an equality tester
// Example: listBooks.Where(book => book.In((bk, id) => bk.Id == id, 1, 2, 3, 4, 5));
public static bool In<T, U>(this T item, Func<T, U, bool> equalitytester, params U[] list)
{
foreach (U arg in list)
{
if (equalitytester(item, arg))
{
return true;
}
}
return false;
}
// See if any item in the first list is also in the second list
public static bool In<T, U>(this IEnumerable<T> list, Func<T, U, bool> equalityTester, params U[] argList)
{
foreach (T item in list)
{
foreach (U arg in argList)
{
if (equalityTester(item, arg))
{
return true;
}
}
}
return false;
}
}
}
您可以聲明List<integer>
或整數數組。 為其添加值。 AND USE Contains
方法
Where(b => lst.Contains(b))
我寫了一個擴展方法,它可以隨心所欲地使用任何類型和任何成員:
public static IEnumerable<TSource> In<TSource, TMember>(this IEnumerable<TSource> source,
Func<TSource, TMember> identifier, params TMember[] values) =>
source.Where(m => values.Contains(identifier(m)));
你可以這樣稱呼它:
var myBooks = Books.In(b => b.Id, 1, 3, 5, 8, 11, 22);
為了我未來的需要,我將其上傳到了NuGet
安裝包Mshwf.NiceLinq
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.