选择执行“针对每个”的语句,然后返回自身

时间:2019-05-10 22:17:19

标签: c# linq

我有一条数据管道。我想对数据进行一些有条件的转换。看来我可以像这样建立枚举而不触发它直到结束:

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的操作也会比较慢。

我的问题是:我认为这样做更快会错吗?如果是这样,您能解释一下哪种替代方法更快/更好以及为什么。

1 个答案:

答案 0 :(得分:4)

您应该这样做,不是因为它不起作用,而是因为它违反了Select所做的普遍期望(转换数据而没有副作用)。

对于这种逻辑,您应该使用foreach。您应该只用一个foreach就可以做到这一点,只枚举一次。使用Select进行此操作并不快。