3

文字列配列引数で IList.Contains を呼び出す簡単な方法を探しています

これを行う方法はありますか:

val[] = {"first", "second"}

var temp = from i in items
           where i.list.Contains(val)
           select i;
4

5 に答える 5

6

またはのいずれ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交差を使用する方が適切です。

于 2013-02-25T13:15:48.980 に答える
5
var temp = from i in items
           where i.list.Any(x => val.Contains(x)) 
           select i;

Allすべてのリスト項目を値にする必要がある場合に使用します

于 2013-02-25T13:13:26.547 に答える
3

私はLINQが本当に苦手なので、それについては触れません。

最初にリストに対して Contains を実行するのは、最速の方法ではありません。リストでLINQを実行しても、高速化することはできません。あなたがする必要があるのは、HashSet を用意してから、Contains を実行することです。リストが 2 つある場合は、2 つの HashSet を作成して交差させます。

http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx

于 2013-02-25T13:14:22.707 に答える
1

配列内の項目のいずれかがリストに存在するかどうかを取得する拡張メソッドを次に示します。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);
于 2013-02-25T13:19:18.467 に答える
1

「含む」とはどういう意味かわかりません。一致するすべてのアイテムが必要な場合は、@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));
    }
于 2013-02-25T13:17:43.843 に答える