我有一条数据管道。我想对数据进行一些有条件的转换。看来我可以像这样建立枚举而不触发它直到结束:
var data = read();
if (!adminUser) data = data.Select(d => {d.ClearAdminOnlyFields(); return d;});
if (summarize) data = data.Select(d => {d.ClearVerboseFields(); return d;});
if (translate) data = data.Select(d => {d.Translate(culture); return d;});
return data;
以上数据为数千个项目。我尝试使用谷歌搜索这种使用select的样式,但是找不到使用它的任何好的示例。似乎人们总是用.ToList()
枚举,然后用.ForEach()
进行转换,但是像这样的多个枚举应该更慢!似乎要对其中的if检查执行一个大foreach
的操作也会比较慢。
我的问题是:我认为这样做更快会错吗?如果是这样,您能解释一下哪种替代方法更快/更好以及为什么。
答案 0 :(得分:4)
您应该不这样做,不是因为它不起作用,而是因为它违反了Select
所做的普遍期望(转换数据而没有副作用)。
对于这种逻辑,您应该使用foreach
。您应该只用一个foreach
就可以做到这一点,只枚举一次。使用Select
进行此操作并不快。