如何打破源集合和LINQ结果之间的链接

时间:2014-08-31 07:40:22

标签: c# linq

例如,我有这样的代码:

IEnumerable<RSuspectOperationCode> distinctCodes = this.Distinct(); // "this" is some collection
this.Clear()
distinctCodes.Count();

由于LINQ是延迟执行查询 - 计数给我们0.我感兴趣 - 是否有一种方法可以获得具有就地结果计算的不同集合并断开源和结果集合之间的链接,即清除源集合不会影响结果收集?

我的解决方法:

    List<RSuspectOperationCode> distinctCodes = new List<RSuspectOperationCode>();
    distinctCodes.AddRange(this.Distinct(comparer));
    this.Clear();
    distinctCodes.Count();

但是,我想知道,是否有更优雅/更短的方式?

4 个答案:

答案 0 :(得分:1)

每当您希望立即执行时,请致电.ToList()

var distinctCodes= this.Distinct().ToList();

this.Clear();

var c1 = this.Count(); // 0

var c2 = distinctCodes.Count(); // eg. 100

答案 1 :(得分:1)

不要在Distinct之后调用ToList,而是在之前调用它,以便在异步列表中延迟执行:

var distinctCodes = this.ToList().Distinct();

答案 2 :(得分:0)

我用来在Linq表达式的末尾添加.ToList()以完成枚举,并获得该集合的副本。

在你的情况下,

... = this.Distinct().ToList()

应该这样做。

答案 3 :(得分:0)

您需要调用一些评估查询的方法。在您的情况下,通过评估查询并将结果放在新数组或ToArray中,调用ToListList<RSuspectOperationCode>将执行您想要的操作。您对原始列表所做的任何更改都不会影响该新列表。

请注意,很多人默认使用ToList,这是错误的。无论情况如何,如果您不打算更改列表的长度,那么您应该使用数组而不是集合。这意味着ToArray应该是您的默认选择,并且只有在您特别需要ToList时才使用List<T>。这不是一个重大问题,但你也可以以正确的方式做事。