我在一家流利式使用功能块谓词Where子句中记录了一些成果,例如考虑:
var bar = SomeEnumerable.Where(i =>
{
if(...)
{
return true;
}
else
{
//Log "failure" to in-memory List<T>
return false;
}
}).Select(...);
有没有我可以捕捉到这一点,不会引入副作用一些其他的方式?
我沿着具有LINQ的扩展方法,可以“三通”它的结果不止一个后续的方法的思路思考。是否已有这样的操作?
我同意关于保持副作用从LINQ的路程,如果可能的话100%。
在这种情况下,你在这里所做的是不是真的过滤序列,而是分组的项目分成两个不同的群体之一。有这样做的比Where
更好的运营商。
var validatedItems = SomeEnumerable.ToLookup(item => IsValid(item));
foreach(var invalidItem in validatedItems[false])
{
LogFailure(invalidItem);
}
var bar = validatedItem[true].Select(...);
请注意,这里ToLookup
急切地计算源序列和您的验证逻辑。如果你想推迟验证直到后来(同时也避免因为它做的验证逻辑顺序,你可能想这样做,对多个枚举),这将大大复杂化这一点。
这是你的代码,做你想做的。
如果你了解增加副作用LINQ的含义,即它不会说,一个SQL查询工作,你知道它会只运行一次.ToList()
或类似被调用。
去吧!
日志记录是在大多数情况下一个非常安全的副作用,如果你在你的遥测需要的信息,这是给你。我可能会使它的方法,而不是一个拉姆达,只是让读者以后可以清楚地看到意图。