HOWTO · Csharp

如何在 C# 中把列表添加到另一个列表

了解如何在 C# 中将一个列表添加到另一个列表

本页内容

若要将一个 C# List<T> 的元素附加到另一个列表,请对应该接收这些元素的列表调用 AddRange。泛型集合类型是 List<T>,其中 T 代表元素类型。源元素会按照其原始顺序,添加到目标现有元素之后。AddRange 会更改目标;它不会将源列表作为嵌套元素添加。当两个集合都包含兼容的元素类型时,请使用此方法。List<T> 存储一种类型的元素,因此请选择匹配的目标和源。

如何在 C# 中把一个列表添加到另一个列表

List<T> 是一个可调整大小的集合,其元素共享相同的类型 T。在此示例中,两个列表都包含整数。System.Collections.Generic 命名空间提供 List<T>,因此如果您的项目尚未导入该命名空间,请将其包含在内。程序会将第二个列表附加到第一个列表,然后打印结果目标列表:

泛型类型表示法是 List<T>;请将 T 替换为每个项共享的元素类型,例如 int。

运行这个完整的示例:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> firstList = new List<int> { 1, 2, 3 };
        List<int> secondList = new List<int> { 4, 5, 6 };

        firstList.AddRange(secondList);

        Console.WriteLine(string.Join(", ", firstList));
    }
}
1, 2, 3, 4, 5, 6

此调用会将 secondList 中的值附加到 firstList 中已有的值之后;目标仍然是一个平面 List<int>。两个列表必须具有兼容的元素类型。例如,List<int> 无法通过此调用从 List<string> 接收字符串。如果目标需要不同的类型,请先转换或映射元素。

使用 List.AddRange 附加一个列表

AddRange 是 List<T> 的实例方法。请对目标调用它,并传入一个提供相同 T 元素的集合。其参数是 IEnumerable<T>,因此源可以是数组或其他兼容的序列;它不一定必须是另一个 List<T>。例如,firstList.AddRange(secondList) 会将源序列附加到 firstList 的末尾。

此方法会枚举源,并按序列顺序附加其元素。调用之后,firstList 包含其原始值,后面接着 secondList 的值,而 secondList 则保留其自身的元素。当后续代码仍需要源集合时,这个区别很重要。如果您也需要保留目标,请如下一节所示,对一个单独的列表调用 AddRange。

保持原始列表不变

若要合并两个输入而不更改任何一个,请从第一个列表创建一个新的目标,并将第二个列表附加到其中:List<int> combined = new List<int>(firstList);,后面接着 combined.AddRange(secondList);。构造函数会将第一个输入的元素复制到一个新列表中,而此方法只会更改那个新的目标。请使用 combined 作为合并后的序列;原始列表仍保持其先前的状态可供使用。

这是浅拷贝。它复制列表结构和元素引用,而不是元素所引用的对象。对于像 int 这样的值类型,值会被复制到新列表中。对于引用类型,新列表和原始列表仍会指向相同的对象。如果这些对象是可变的,且需要独立的状态,也请创建这些对象的副本。

添加自定义对象的列表

当源元素可以存储在目标中时,AddRange 也适用于自定义类。例如,如果 people 和 peopleToAdd 都是 List<Person>,调用 people.AddRange(peopleToAdd) 会将每个人放置在现有条目之后。然后您可以遍历 people,并读取像 person.Name 这样的属性来显示或处理它们。

此方法会附加对现有 Person 实例的引用;它不会克隆这些对象。通过任一列表更改一个可变的人,通过另一个列表也能看到,因为两个列表都引用同一个实例。相同的方法也适用于其他自定义类型,例如产品或用户记录,前提是它们的元素类型与目标的 T 兼容。