我正在寻找一种使用字符串数组参数调用 IList.Contains 的快速方法
有没有办法做到这一点:
val[] = {"first", "second"}
var temp = from i in items
where i.list.Contains(val)
select i;
如果要检查是否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
使用交集会更合适。
var temp = from i in items
where i.list.Any(x => val.Contains(x))
select i;
All
如果所有列表项都应在值中,则使用
我真的不擅长 LINQ,所以我不打算解决这个问题。
首先在列表上执行包含并不是最快的事情。在列表上执行 LINQ 并不能让它更快。你需要做的是有一个 HashSet,然后做一个 Contains。如果您有两个列表,我会说创建两个 HashSet 并将它们相交。
http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx
不确定“包含”是什么意思,如果您想要所有匹配的项目,@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));
}
这是一个扩展方法,用于获取数组中的任何项目是否存在于列表中。这个返回一个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);