如何登录Where方法的结果吗?

问题描述 投票:0回答:2

我在一家流利式使用功能块谓词Where子句中记录了一些成果,例如考虑:

var bar = SomeEnumerable.Where(i =>
    {
        if(...)
        {
            return true;
        }
        else
        {
            //Log "failure" to in-memory List<T>
            return false;
        }
    }).Select(...);

有没有我可以捕捉到这一点,不会引入副作用一些其他的方式?

我沿着具有LINQ的扩展方法,可以“三通”它的结果不止一个后续的方法的思路思考。是否已有这样的操作?

我同意关于保持副作用从LINQ的路程,如果可能的话100%。

c# linq
2个回答
0
投票

在这种情况下,你在这里所做的是不是真的过滤序列,而是分组的项目分成两个不同的群体之一。有这样做的比Where更好的运营商。

var validatedItems = SomeEnumerable.ToLookup(item => IsValid(item));

foreach(var invalidItem in validatedItems[false])
{
    LogFailure(invalidItem);
}

var bar = validatedItem[true].Select(...);

请注意,这里ToLookup急切地计算源序列和您的验证逻辑。如果你想推迟验证直到后来(同时也避免因为它做的验证逻辑顺序,你可能想这样做,对多个枚举),这将大大复杂化这一点。


0
投票

这是你的代码,做你想做的。

如果你了解增加副作用LINQ的含义,即它不会说,一个SQL查询工作,你知道它会只运行一次.ToList()或类似被调用。

去吧!

日志记录是在大多数情况下一个非常安全的副作用,如果你在你的遥测需要的信息,这是给你。我可能会使它的方法,而不是一个拉姆达,只是让读者以后可以清楚地看到意图。

© www.soinside.com 2019 - 2024. All rights reserved.