检查两个IEnumerable之间的存在

时间:2010-06-10 11:16:06

标签: c# .net linq

IEnumerable<String> existedThings = 
        from mdinfo in mdInfoTotal select mdinfo.ItemNo;

IEnumerable<String> thingsToSave = 
        from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value;

这是两个IEnumerable

我想检查value in existedThings中是否存在thingsToSave

O.K。我可以用3行代码来做到这一点。

bool hasItemNo;
foreach(string itemNo in existedThings)
    hasItemNo= thingsToSave.Contains(itemNo);

但是,看起来很脏。

我只是想知道是否有更好的解决方案。

7 个答案:

答案 0 :(得分:8)

 int[] id1 = { 44, 26, 92, 30, 71, 38 };
 int[] id2 = { 39, 59, 83, 47, 26, 4, 30 };

 IEnumerable<int> both = id1.Intersect(id2);

 foreach (int id in both)
     Console.WriteLine(id);

 //Console.WriteLine((both.Count() > 0).ToString());
 Console.WriteLine(both.Any().ToString());

寻找Enumerable.Intersect Method

答案 1 :(得分:8)

如果IEnumerable不是从实现ICollection&lt;&gt;的类派生的,则upvoted答案提出了一种具有O(n ^ 2)复杂度的算法。以Linq查询为例。然后,Count()扩展方法必须迭代所有元素来计算它们。这不酷。您只需要检查结果是否包含任何元素:

 bool hasItemNo = existedThings.Intersect(thingsToSave).Any();

顺序很重要btw,使你期望具有最小项目数的枚举成为Intersect()的参数。

答案 2 :(得分:4)

您可以使用Intersect来实现此目标:

// puts all items that exists in both lists into the inBoth sequence
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave);

答案 3 :(得分:4)

bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0;

如果需要,您甚至可以提供自己的比较器:Enumerable.Intersect

答案 4 :(得分:3)

它很脏而且也行不通!如果hasItemNo中的最后一个值位于true,则existedThings只会thingsToSave

虽然你用“Linq”标记了这个,但我猜这段代码对你有用:

bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0

答案 5 :(得分:2)

您可以尝试intersecting the two sequences并查看结果序列是否包含任何元素

答案 6 :(得分:2)

不完全清楚你真正想要的是什么,但是这里建议只检索thingstoSave和existedThings中存在的字符串。

IEnumerable<String> existedThings = 
        from mdinfo in mdInfoTotal select mdinfo.ItemNo;

IEnumerable<String> thingsToSave = 
        from item in lbXReadSuccess.Items.Cast<ListItem>() 
        where existedThings.Contains(item.Value)
        select item.Value;