代码之家  ›  专栏  ›  技术社区  ›  Luc Morin

如何记录Where方法的结果?

  •  0
  • Luc Morin  · 技术社区  · 7 年前

    我正在考虑使用流畅风格的Where子句中的函数块谓词来记录一些结果,例如:

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

    我一直在考虑使用Linq扩展方法,它可以将结果“T”到多个后续方法。已经有这样的接线员了吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Servy    7 年前

    在本例中,您在这里所做的不是真正地过滤序列,而是将项目分组到两个不同组中的一个组中。有比这更好的运营商 Where .

    var validatedItems = SomeEnumerable.ToLookup(item => IsValid(item));
    
    foreach(var invalidItem in validatedItems[false])
    {
        LogFailure(invalidItem);
    }
    
    var bar = validatedItem[true].Select(...);
    

    ToLookup 这里急切地评估源序列和验证逻辑。如果您希望将验证推迟到以后(同时避免多次枚举序列,您可能需要 如果您想这样做,考虑到它正在执行验证逻辑),这将使问题变得非常复杂。

        2
  •  0
  •   tigerswithguitars    7 年前

    如果您理解将副作用添加到LINQ的含义,即它不会与SQL查询一起工作,并且您知道它只会运行一次 .ToList() 或类似的名称。