gpt4 book ai didi

c# - foreach vs LINQ 查找集合之间的差异

转载 作者:太空宇宙 更新时间:2023-11-03 19:12:34 24 4
gpt4 key购买 nike

我有一个 ArrayList ids 包含作为 ID 的 String 对象,另一个 ArrayList objs 包含具有字符串 ID 字段的对象。现在我有代码,可以找到哪些 idsobjs 中没有匹配,它看起来像这样:

var missing = new List<string>();

foreach (MyObj obj in objs)
{
if (!ids.Contains(obj.ID))
{
missing.Add(obj.ID);
}
}

这很好用。但我将其重写为这个练习,以更好地“在 LINQ 中思考”:

var missing = objs.Cast<MyObj>().Select(x => x.ID).Except(ids.Cast<string>());

I expected this LINQ to be slowerforeach + Contains 方法(特别是由于 Cast 调用),但 LINQ 运行速度明显更快。 LINQ 方法有哪些不同之处可带来性能优势?

最佳答案

LINQ Except使用 HashSet在内部,它有 O(1) Contains方法性能,当它是 O(n)ArrayList .这就是它速度更快的原因。

但正如 Tim 在他的评论中指出的那样,您的 Except方法并没有真正产生任何结果。它只是定义了一个查询。只要您需要结果,查询就会立即执行。并且它可能会被执行多次。您应该添加 ToList()打电话获取List<T>明确地:

var missing = objs.Cast<MyObj>().Select(x => x.ID).Except(ids.Cast<string>()).ToList();

顺便问一下,你为什么要使用 ArrayList而不是通用 List<T>

关于c# - foreach vs LINQ 查找集合之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com