检查两个IEnumerable之间的存在

Sun*_*Lim 5 .net c# linq

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

IEnumerable<String> thingsToSave = 
        from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value;
Run Code Online (Sandbox Code Playgroud)

这是两个IEnumerable.

我想检查一下是否value in existedThings存在thingsToSave.

好的我可以用3行代码做到这一点.

bool hasItemNo;
foreach(string itemNo in existedThings)
    hasItemNo= thingsToSave.Contains(itemNo);
Run Code Online (Sandbox Code Playgroud)

但是,看起来很脏.

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

VMA*_*Atm 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());
Run Code Online (Sandbox Code Playgroud)

查找Enumerable.Intersect方法

  • 使用.Any()而不是.Count()> 0来避免不必要的迭代. (6认同)

Han*_*ant 8

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

 bool hasItemNo = existedThings.Intersect(thingsToSave).Any();
Run Code Online (Sandbox Code Playgroud)

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