【问题标题】:Another Linq translation question另一个 Linq 翻译问题
【发布时间】:2010-01-28 19:22:24
【问题描述】:

好的,所以我正在迭代一个集合。对于满足某些条件的每个成员,我想对该成员调用一个方法:

这是我现在的做法:

foreach(MyObject obj in myCollection) { if(obj.Property == theSearchValue) obj.DoIt(); }

对于它的价值,我认为 foreach 是最易读、最清晰的方法(我们可以谈论关于花括号的要点),所以这对我来说更像是一个学术/学习问题。

问题:用 Linq 表达这一点的最佳方式是什么?有没有比我的 foreach 循环更清晰/可读/可维护的 Linqy 方法?如果是这样,它会在不牺牲性能的情况下这样做吗?

(我看到的很多 linq 操作看起来都很整洁,但它们通常会导致创建中间可枚举对象,或者有时会多次枚举集合——我的小 foreach 在 1 遍中解决了问题,没有临时已创建集合。)

【问题讨论】:

  • Justin 展示的 LINQ 版本不会创建临时集合。这是一次通行证,就像你的一样。选择你喜欢的。

标签: c# linq


【解决方案1】:

您不会从使用 LINQ 中获得太多...

var matches = myCollection.Where(i => i.Property == theSearchValue);

foreach(var item in matches)
    item.DoIt();

您还可以使用扩展方法添加Each() 方法来隐藏循环(但不会提高效率)。生成的代码如下所示:

myCollection.Where(i => i.Property == theSearchValue).Each(i => i.DoIt());

【讨论】:

    【解决方案2】:
    foreach (MyObject obj in 
                        myCollection.Where(item => item.Property == theSearchValue))
        obj.DoIt();
    

    【讨论】:

    • 我喜欢这个清晰。但是你知道“where”扩展是一次执行的扩展之一,还是一个yield? (例如:该代码是执行 2 个循环还是 1 个循环?)
    • @JMarsch,一切正常,只有 1 个循环。去IL取证
    • 我真的很喜欢你的答案和贾斯汀的我认为你的答案是最易读的,所以我将你的答案标记为答案。感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2012-10-27
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多