如何正确填充IEnumerable集合?填充后触发索引越界异常
问题原因与解决办法
问题根源
你代码里的Enumerable.Append方法不会修改原有的IEnumerable<WidgetA>对象——它是一个纯方法,每次调用都会返回一个包含新增元素的全新序列。你连续调用Append但没有把返回值重新赋值给list,导致原list始终是空的Enumerable.Empty<WidgetA>,转成List后自然没有元素,访问索引0就触发了越界异常。
正确写法
写法1:接收Append返回的新序列
using System; using System.Linq; using System.Collections.Generic; public class Program { public static void Main() { var key1 = new WidgetA{Id = 1, Key = 52}; var key2 = new WidgetA{Id = 1, Key = 102}; var key3 = new WidgetA{Id = 1, Key = 152}; IEnumerable<WidgetA> list = Enumerable.Empty<WidgetA>(); // 必须接收Append返回的新序列 list = list.Append(key1); list = list.Append(key2); list = list.Append(key3); Console.WriteLine(list.ToList()[0]); } } public class WidgetA { public int Id { get; set; } public int Key { get; set; } public string ValueToGet { get; set; } }
写法2:用List直接存储元素(更常用)
如果需要频繁添加元素,优先用List<T>这类具体的集合容器,它的Add方法会直接修改容器本身:
using System; using System.Collections.Generic; public class Program { public static void Main() { var key1 = new WidgetA{Id = 1, Key = 52}; var key2 = new WidgetA{Id = 1, Key = 102}; var key3 = new WidgetA{Id = 1, Key = 152}; List<WidgetA> list = new List<WidgetA>(); list.Add(key1); list.Add(key2); list.Add(key3); Console.WriteLine(list[0]); } } public class WidgetA { public int Id { get; set; } public int Key { get; set; } public string ValueToGet { get; set; } }
写法3:集合初始化器(最简洁)
直接用集合初始化语法创建List,一步完成元素添加:
using System; using System.Collections.Generic; public class Program { public static void Main() { List<WidgetA> list = new List<WidgetA> { new WidgetA{Id = 1, Key = 52}, new WidgetA{Id = 1, Key = 102}, new WidgetA{Id = 1, Key = 152} }; Console.WriteLine(list[0]); } } public class WidgetA { public int Id { get; set; } public int Key { get; set; } public string ValueToGet { get; set; } }
补充说明
IEnumerable<T>只是一个可枚举序列的抽象接口,它本身不负责存储元素。LINQ的Append/Prepend等方法都是延迟执行的,每次调用都生成新序列而非修改原序列;如果需要直接操作元素存储,使用List<T>、HashSet<T>这类实现了ICollection<T>的具体集合类会更高效直观。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

