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包含or : "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,所以我不打算解决这个问题。

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

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

于 2013-02-25T13:14:22.707 回答
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));
    }
于 2013-02-25T13:17:43.843 回答
1

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