You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确填充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:35:19