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);
但是,看起来很脏。
我只是想知道是否有更好的解决方案。
答案 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());
答案 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;