我有以下查询:
drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();
Run Code Online (Sandbox Code Playgroud)
drivers是一个List,它带有不同的id和更新的值,因此我在更改Select中的值,但这是正确的方法.我已经知道我没有给司机重新分配司机,因为Resharper抱怨它,所以我想如果是这样会更好:
drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();
Run Code Online (Sandbox Code Playgroud)
但这仍然是某人应该为驱动程序列表中的每个元素分配新值的方式吗?
das*_*ght 34
虽然这看起来很无辜,特别是与一个ToList
立即执行代码的调用相结合,但我肯定会远离修改任何东西作为查询的一部分:这个技巧是如此不寻常以至于它会让你的程序的读者绊倒,即使是经验丰富的程序,特别是如果他们以前从未见过这个.
foreach
循环没有问题- 你可以用LINQ做这件事并不意味着你应该这样做.
Eri*_*ert 30
永远不要这样做.查询应该是查询 ; 它应该是非破坏性地询问数据源的问题.如果你想引起副作用,那就用一个foreach
循环; 这就是它的用途.使用正确的工具完成工作.
好的,我会自己回答.
Xaisoft,Linq
查询,无论是lambda表达式还是查询表达式,都不应该用于变异列表.因此你的Select
drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();
Run Code Online (Sandbox Code Playgroud)
是不好的风格.它混淆/不可读,不标准,反对Linq
哲学.实现最终结果的另一种糟糕方式是:
drivers.Any(d => { d.id = 0; d.updated = DateTime.Now; return false; });
Run Code Online (Sandbox Code Playgroud)
但是,这并不是说ForEach
上List<T>
是不合适的.它可以在像你这样的情况下找到用途,但不要将变异与Linq
查询混合在一起,就是这样.我更喜欢这样写:
drivers.ForEach(d => d.updated = DateTime.Now);
Run Code Online (Sandbox Code Playgroud)
它优雅而易懂.既然它没有处理Linq
,它也不会混淆.我不喜欢lambda中的多个语句(如你的情况)的语法.当事情变得复杂时,它的可读性会降低一点,也难以调试.在你的情况下,我更喜欢直接foreach
循环.
foreach (var d in drivers)
{
d.id = 0;
d.updated = DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)
我个人喜欢ForEach
上IEnumerable<T>
作为终止呼叫以Linq
表达(即,如果该分配并不意味着是一个查询,但执行).
归档时间: |
|
查看次数: |
18478 次 |
最近记录: |