当前位置:  开发笔记 > 编程语言 > 正文

比.ToArray()更好的强制LINQ输出的枚举

如何解决《比.ToArray()更好的强制LINQ输出的枚举》经验,为你挑选了2个好方法。

我正在使用LINQ to objects并且有一个函数,在某些情况下我需要在调用之前修改底层集合Aggregate(...),然后在函数返回结果之前将其返回到其原始状态Aggregate(...).我当前的代码看起来像这样:

bool collectionModified = false;
if(collectionNeedsModification)
{
    modifyCollection();
    collectionModified = true;
}

var aggregationResult = from a in
                            (from b in collection
                             where b.SatisfysCondition)
                             .Aggregate(aggregationFunction)
                        select a.NeededValue;

if(collectionModified)
    modifyCollection();

return aggregationResult;

但是,如上所述,如果我修改了集合,我将得到错误的结果,因为我在aggregationResult枚举之前将集合恢复到其原始状态,并且LINQ结果是惰性评估的.我目前的解决方案是使用.ToArray()我的LINQ查询,如下所示:

var aggregationResult = (from a in
                            (from b in collection
                             where b.SatisfysCondition)
                             .Aggregate(aggregationFunction)
                         select a.NeededValue).ToArray();

结果数组的大小总是很小(<100项),因此内存/处理时间不是问题.这是处理我的问题的最佳方法,还是有更好的方法来强制评估LINQ查询?



1> Jon Skeet..:

只是为了检查我理解你 - 你基本上想要遍历所有的结果,只是为了强制发生任何副作用?

副作用通常是一个坏主意,因为这种逻辑更难理解.话虽如此,最简单的方法并强制进行全面评估可能只是迭代它:

foreach (var result in aggregationResult)
{
    // Deliberately empty; simply forcing evaluation of the sequence.
}

或者,您可以使用LastOrDefault()来避免ToArray()中涉及的所有复制.只要结果没有实现(包括快捷方式),Count()就可以IList了.


我更喜欢`.LastOrDefault()`.请注意,`LastOrDefault`也是一个捷径(在我的版本中,.NET 4.5.2).如果源是`IList <>`,它将首先得到`Count`,然后使用索引器获取索引为`Count - 1`的元素.例如,这可以工作(使用Moq):`var listMock = new Mock >(MockBehavior.Strict); listMock.Setup(x => x.Count).Returns(666); listMock.Setup(x => x [665]).返回("last one"); var last = listMock.Object.LastOrDefault();`

2> Markus Johns..:

(注意:在没有编译器的情况下键入,因此代码未经测试)

如果您已将.NET的Reactive Extensions作为依赖项,则可以使用Run():

aggregationResult.Run();

但是可能不值得为此添加依赖项.

您也可以自己实现Run方法作为扩展方法:

public static MyLinqExtensions 
{
     public static void Run(this IEnumerable e)
     {
         foreach (var _ in e);
     }
}

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有