IList.Contains(string [])如何在C#中?

时间:2013-02-25 13:11:08

标签: c# linq

我正在寻找一种使用字符串数组参数

调用IList.Contains的快速方法

有没有办法做到这一点:

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

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

5 个答案:

答案 0 :(得分: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;

但是,如果性能至关重要(想想在数百个项目的循环中调用),那么使用HashSet交集as advised by Hermit会更合适。

答案 1 :(得分:5)

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

如果所有列表项都应为值

,请使用All

答案 2 :(得分:3)

我对LINQ非常不好,所以我不打算解决这个问题。

首先在列表中进行包含并不是最快的事情。在列表上执行LINQ并不是为了使它更快。你需要做的是有一个HashSet,然后做一个包含。如果您有两个列表,我说创建两个HashSets并将它们相交。

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

答案 3 :(得分:1)

不确定'包含'是什么意思,如果你想要所有匹配的项目,@ lazyberezovsky的回答应该是正确的。

但是,如果要覆盖IList.Contains以支持数组(或Enumerable),则可以执行此操作:

    /// <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));
    }

答案 4 :(得分:1)

这是一个扩展方法,用于获取列表中是否存在数组中的任何项。这个返回bool,如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);