【问题标题】:What is the best type to hold an ordered pair of values of the same type in C#?在 C# 中保存相同类型的有序值对的最佳类型是什么?
【发布时间】:2012-04-03 10:43:12
【问题描述】:

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

我想要这样:

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

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

【问题讨论】:

标签: c# .net types


【解决方案1】:

您可以像这样扩展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");
       }
    }
}

编辑:添加了构造函数。

【讨论】:

  • 看起来不错,只需要声明一种类型而不是两种。
  • @sixfeetsix:我还添加了一个构造函数(我猜没有它就无法编译)。你可以像这样使用它:var fnord = new Pair&lt;string&gt;("foo", "bar")。您还可以添加一个静态 Pair.Create 方法(如在 Tuple 中),以从参数推断类型。
【解决方案2】:

除了没有索引器之外,Tuple&lt;T1, T2&gt; 似乎符合您的需求。

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&lt;T&gt; : Tuple&lt;T, T&gt; 并添加索引器。

【讨论】:

    【解决方案3】:

    你可以像这样创建一个元组列表:

    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")
    };
    

    【讨论】:

      【解决方案4】:

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

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

      缺点是不同大小的数组在类型系统中看起来是一样的,所以你不能,例如,声明一个只接收 T[2] 而不是 T[3] 的函数。如果这是个问题,请使用noah1989's solution

      【讨论】:

      • C# 数组可以有静态大小?
      • @sixfeetsix Yup。这就是为什么我们需要List 用于“非固定大小的数组”。
      • 不能在运行时改变数组的大小?
      • @sixfeetsix 不。您可以重新定义它(即创建一个新数组并将其分配给用于指向旧数组的引用),但无法调整现有内存板的大小。
      • 抱歉,我的意思是 变量的类型 允许引用不同大小的数组,即使数组 object 的长度是固定的.
      猜你喜欢
      • 2020-09-23
      • 2016-02-08
      • 2020-02-23
      • 2022-09-27
      • 2021-04-28
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多