如果做两件事,是否可以将foreach操作转换为LINQ?

Kon*_*ten 4 c# linq foreach

我的工作经验如下.

List<Thing> things = new List<Thing>();
foreach (Original original in originals)
  things.Add(new Thing(orignal));
Run Code Online (Sandbox Code Playgroud)

然后,我变得聪明并将其LINQified到以下,仍在工作的代码.

IEnumerable<Thing> things = originals.Select(origo => new Thing(origo));
Run Code Online (Sandbox Code Playgroud)

感到非常自豪的是抽取行数以及LINQing自己更清晰的代码我意识到还需要更新进程表.在我们进行转换时,必须同时进行更新.因此,我的双腿之间的尾巴感觉不那么自豪,我回到原始代码并添加了通知方法.

List<Thing> things = new List<Thing>();
foreach (Original original in originals)
{
  things.Add(new Thing(orignal));
  DoTell();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以保留LINQie语法并仍能以某种方式合并出纳员.我并不希望代码看起来不错,也不会那么可读(尽管如此,它会很棒).但是,目前它的学术好奇心和纯粹固执的问题-我想知道它是否能够做到在所有.

Kam*_*ski 5

这样做有一种非常难看的方式.这纯粹是学术性的.

IEnumerable<Thing> things = originals.Select(origo => {DoTell(); return new Thing(origo)});
Run Code Online (Sandbox Code Playgroud)

您将更新表格并返回new ThingSelect.选择不会失败,因为你在其中使用括号并告诉你只返回new Thing不是结果DoTell()

我建议你一起去,foreach因为它最终看起来会更干净.在任何地方使用LINQ都不是更清晰/更清晰的代码的解决方案.

编辑:

如果你仍然想要使用LINQ,你甚至可以做它更丑陋的版本(单行):

var things = things.Select(x => new { o = new Thing(), b = DoTell()}).Select(x=>x.o);
Run Code Online (Sandbox Code Playgroud)

这种做法纯粹邪恶的.但它没有返回声明:)

  • 我同意.LINQ确实美化了代码,但只在必要时才会使用 (4认同)