我正在寻找一种使用字符串数组参数
调用IList.Contains的快速方法有没有办法做到这一点:
val[] = {"first", "second"}
var temp = from i in items
where i.list.Contains(val)
select i;
答案 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);