在C#中,保存同一类型的有序值对的最佳类型是什么

本文关键字:类型 最佳 是什么 保存 | 更新日期: 2023-09-27 18:29:54

在C#中保存同一类型的有序值对的最佳类型是什么?

我想要的是:

  1. 两个值的组合在编译时强制执行(在编译或运行时不可能尝试添加或删除)
  2. 两个值具有相同的静态类型
  3. 可以使用索引器检索两个值(例如对[0]、对[1])。

    更新:我改变了主意,我真的不想要#3了,因为它毫无意义地为越界异常打开了大门:

在C#中,保存同一类型的有序值对的最佳类型是什么

您可以这样扩展Tuple类:

public class Pair<T> : Tuple<T, T>
{
    public Pair<T>(T item1, T item2) : base(item1, item2)
    {           
    }
    public T this[int index]
    {
       get
       {
           if (index == 0)
               return Item1;
           else if (index == 1)
               return Item2;
           throw new ArgumentOutOfRangeException("index");
       }
    }
}

编辑:添加了构造函数。

除了没有索引器之外,Tuple<T1, T2>似乎符合您的需求。

Tuple<int, int> myPair = Tuple.Create(1, 2);
int firstValue = myPair.Item1;   // instead of myPair[0]
int secondValue = myPair.Item2;  // instead of myPair[1]

当然,如果需要的话,没有什么可以阻止您对MyPair<T> : Tuple<T, T>进行子类化并添加索引器。

您可以创建这样的元组列表:

var data = new List<Tuple<string, string>>();
data.Add(new Tuple<string, string>("string1","string2"));
Tuple<string, string> record = data[0];

编辑:如果你想它是只读的:

public static readonly List<Tuple<string, string>> data = new List<Tuple<string, string>>
{
    new Tuple<string, string>("string1", "string2"),
    new Tuple<string, string>("set2", "set2b")
};

一个由2个元素组成的普通数组怎么样?

  • 数组是固定大小的,因此不能添加或删除元素
  • 所有元素都具有相同的编译时类型
  • 您可以使用索引器

缺点是不同大小的数组在类型系统中看起来是相同的,因此不能声明一个只接收t[2]而不接收t[3]的函数。如果这是一个问题,请使用noah1989的解决方案。