進出口尋找一個快速的方法來調用IList.Contains一個字符串數組參數IList.Contains(string [])如何在C#中?
有沒有辦法做到這一點:
val[] = {"first", "second"}
var temp = from i in items
where i.list.Contains(val)
select i;
進出口尋找一個快速的方法來調用IList.Contains一個字符串數組參數IList.Contains(string [])如何在C#中?
有沒有辦法做到這一點:
val[] = {"first", "second"}
var temp = from i in items
where i.list.Contains(val)
select i;
如果你想檢查是否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會更合適。
任何聲明正是我一直在尋找。非常感謝。 – 2013-02-25 13:59:17
var temp = from i in items
where i.list.Any(x => val.Contains(x))
select i;
使用All
如果所有列表項應該是值
我在LINQ上真的很糟糕,所以我不打算解決這個問題。
首先做一個包含在列表中並不是最快的事情。在列表上做一個LINQ並不是爲了讓它更快。你需要做的是有一個HashSet,然後做一個Contains。如果你有兩個列表,我會說創建兩個HashSets並相交它們。
http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx
不確定你的意思是'包含',如果你想要所有匹配的項目,@ lazyberezovsky的答案應該是正確的。
但是,如果你想overrride 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));
}
下面是一個擴展方法來獲得是否有任何數組元素的存在列表。這一個返回一個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);
你的意思是 「既包含」 或 「包含任何」? – 2013-02-25 13:12:16
[linq where list contains any list in]的可能重複(http://stackoverflow.com/questions/10667675/linq-where-list-contains-any-in-list) – 2013-02-25 13:12:32