c# – 是否有规范方法来“修复”“动态”IEnumerable?

IEnumerable不保证枚举两次会产生相同的结果.实际上,创建一个示例,其中myEnumerable.First()在执行两次时返回不同的值非常容易:
class A {
    public A(string value) { Value = value; }
    public string Value {get; set; } 
}

static IEnumerable<A> getFixedIEnumerable() {
    return new A[] { new A("Hello"),new A("World") };
}

static IEnumerable<A> getDynamicIEnumerable() {
    yield return new A("Hello");
    yield return new A("World");
}

static void Main(string[] args)
{
    IEnumerable<A> fix = getFixedIEnumerable();
    IEnumerable<A> dyn = getDynamicIEnumerable();

    Console.WriteLine(fix.First() == fix.First()); // true
    Console.WriteLine(dyn.First() == dyn.First()); // false
}

这不仅仅是一个学术性的例子:使用流行的… in …选择新的A(…)将创造这种情况.这可能会导致意外行为:

fix.First().Value = "NEW";
Console.WriteLine(fix.First().Value); // prints NEW

dyn.First().Value = "NEW";
Console.WriteLine(dyn.First().Value); // prints Hello

我理解为什么会这样.我也知道这可以通过在Enumerable上执行ToList()或通过覆盖==来替代A来解决.这不是我的问题.

问题是:当你编写一个采用任意IEnumerable的方法并且你想要一次只评估序列的属性(然后引用是“固定的”)时,这样做的规范方法是什么? ToList()似乎主要用于,但如果源已经修复(例如,如果源是一个数组),引用将被复制到一个列表(不必要的,因为我需要的只是固定属性).是否有更合适的东西或ToList()这个问题的“规范”解决方案?

解决方法

ToList绝对是最佳选择.

它有一些优化:如果输入枚举是ICollection(例如数组或列表),它将调用ICollection.copyTo将集合复制到数组而不是实际枚举 – 因此除非集合很大,否则成本不太可能很大.

恕我直言,一般来说,大多数方法返回ICollection< T>是更好的.或IList< T>而不是IEnumerable< T>,除非你想向消费者暗示该实现可能使用延迟评估(例如yield)的方法.

方法应该返回不可变列表的情况下,返回只读包装器(ReadOnlyCollection< T>),例如,通过调用ToList().AsReadOnly(),但仍返回接口类型IList< T>.

如果您遵循此指南,该方法的使用者将不需要对ToList进行不必要的调用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么
长整型输出格式是什么
C语言中文件包含的命令关键字是什么
c程序如何编写x的y次方
c语言开根号代码是什么
c语言怎么进行字符串比较
c语言怎么进行强制类型转换
c语言运算符的优先级顺序是什么
c++用什么软件编程
中序遍历是怎么遍历的
h文件和c文件的关系是什么