文字列配列引数で IList.Contains を呼び出す簡単な方法を探しています
これを行う方法はありますか:
val[] = {"first", "second"}
var temp = from i in items
where i.list.Contains(val)
select i;
またはのいずれi.list
かが含まれているかどうかを確認する場合: "first"
"second"
var val = new [] { "first", "second" };
var temp = from i in items
where val.Any (i.list.Contains)
select i;
または両方i.list
が含まれているかどうかを確認したい場合: "first"
"second"
var val = new [] { "first", "second" };
var temp = from i in items
where val.All (i.list.Contains)
select i;
ただし、パフォーマンスが重要な場合 (数百のアイテムのループで呼び出されると考えてください)、Hermit のアドバイスに従ってHashSet
交差を使用する方が適切です。
var temp = from i in items
where i.list.Any(x => val.Contains(x))
select i;
All
すべてのリスト項目を値にする必要がある場合に使用します
私はLINQが本当に苦手なので、それについては触れません。
最初にリストに対して Contains を実行するのは、最速の方法ではありません。リストでLINQを実行しても、高速化することはできません。あなたがする必要があるのは、HashSet を用意してから、Contains を実行することです。リストが 2 つある場合は、2 つの HashSet を作成して交差させます。
http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx
配列内の項目のいずれかがリストに存在するかどうかを取得する拡張メソッドを次に示します。bool
これはlike を返しますIList.Contains
。
public static class IListExtensions
{
public static bool ContainsAny<T>(this IList<T> list, IEnumerable<T> enumerable)
{
foreach (var item in enumerable)
{
if (list.Contains(item))
return true;
}
return false;
}
}
使用法:
IList<int> a = // ...
string[] b = // ...
a.ContainsAny(b);
「含む」とはどういう意味かわかりません。一致するすべてのアイテムが必要な場合は、@lazyberezovsky の答えが正しいはずです。
ただし、配列 (または Enumerable) をサポートするために IList.Contains をオーバーライドする場合は、次のようにします。
/// <summary>
/// Return true if <paramref name="allItems"/>
/// contains one or more <paramref name="candidates"/>
/// </summary>
public static bool Contains<T>(IList<T> allItems, IEnumerable<T> candidates)
{
if (null == allItems)
return false;
if (null == candidates)
return false;
return allItems.Any(i => candidates.Contains(i));
}