在C#中,保存同一类型的有序值对的最佳类型是什么
本文关键字:类型 最佳 是什么 保存 | 更新日期: 2023-09-27 18:29:54
在C#中保存同一类型的有序值对的最佳类型是什么?
我想要的是:
- 两个值的组合在编译时强制执行(在编译或运行时不可能尝试添加或删除)
- 两个值具有相同的静态类型
-
可以使用索引器检索两个值(例如对[0]、对[1])。
更新:我改变了主意,我真的不想要#3了,因为它毫无意义地为越界异常打开了大门:
您可以这样扩展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的解决方案。