HOWTO · Csharp

在 C# 中初始化元组列表

本文探讨在 C# 中高效初始化元组列表的几种方法。

本页内容

在 C# 中初始化元组列表时,可以选择用于引用元组的 List<Tuple<int, string>>,或用于值元组的 List<(int, string)>。你可以通过集合初始化器创建列表项,使用 Add() 逐项添加,或用 LINQ 将现有序列投影为元组。这两种元组类型并不相同,因此应根据代码其他部分使用的类型来选择。

在 C# 中使用 Tuple.Create() 方法初始化元组列表

Tuple.Create() 会创建引用元组。使用集合初始化器,可以在声明 List<Tuple<int, string>> 时一次创建多个列表项:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<Tuple<int, string>>
        {
            Tuple.Create(1, "Apple"),
            Tuple.Create(2, "Banana"),
            Tuple.Create(3, "Cherry")
        };

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

泛型列表类型记录了元组元素的类型:先是 int,然后是 string。Tuple.Create() 会根据每对值推断这些类型,而循环会按照插入顺序遍历列表项。有关可用重载,请参阅 Tuple.Create() 方法文档。

在 C# 中使用 () 表示法初始化元组列表

列表也可以包含值元组,其写法是 () 表示法。下面的示例使用 List<(int, string)>,并直接初始化三个列表项:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<(int, string)>
        {
            (1, "Apple"),
            (2, "Banana"),
            (3, "Cherry")
        };

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

这里,(int, string) 是值元组的元素类型,每个括号括起的数值对对应一个列表项。相同的数值对也可以使用不同的列表元素类型表示。了解更多关于 C# 中的值元组。

在 C# 中使用 List<Tuple<T1, T2>> 和 Add() 初始化元组列表

如果列表项会陆续到达,或需要通过应用程序逻辑组装列表,可以使用 Add()。先创建一个空列表,再逐项追加引用元组:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var tupleList = new List<Tuple<int, string>>();

        tupleList.Add(Tuple.Create(1, "Apple"));
        tupleList.Add(Tuple.Create(2, "Banana"));
        tupleList.Add(Tuple.Create(3, "Cherry"));

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

列表声明的类型决定了它存储哪种元组。每次调用 Add() 都会追加一个 Tuple<int, string>;Tuple.Create() 则根据提供的值创建该引用元组。

在 C# 中使用 LINQ 初始化元组列表

如果元组列表项来自现有序列,LINQ 会很有用。Select() 会将每个数字投影为一个元组,而 ToList() 会将投影后的序列具体化为列表:

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var tupleList = Enumerable.Range(1, 3)
            .Select(i => Tuple.Create(i, $"Fruit{i}"))
            .ToList();

        foreach (var tuple in tupleList)
        {
            Console.WriteLine(tuple);
        }
    }
}

Enumerable.Range(1, 3) 会提供 1、2 和 3。投影操作会将每个数字与一个字符串配对,ToList() 则返回 List<Tuple<int, string>>。由于投影使用了 Tuple.Create(),这些元组属于引用元组。

总结

对于一组固定值,无论使用 Tuple.Create() 还是值元组字面量,集合初始化器都能简洁地创建列表。使用 Add() 可以逐步构建 List<Tuple<T1, T2>>;如果要将现有序列转换为元组列表,则可以使用 LINQ。引用元组(Tuple<T1, T2>)和值元组((T1, T2))是不同类型;应根据代码使用的 API 和数据保持所选类型一致。