如何轻松初始化一个元组列表?
如何轻松初始化一个元组列表?
我喜欢使用元组,它们可以使你快速地将相关信息组合在一起,而无需编写相应的结构体或类。这对于重构非常局部化的代码非常有用。
但是初始化它们的列表似乎有些多余。
var tupleList = new List<Tuple<int, string>> { Tuple.Create( 1, "cow" ), Tuple.Create( 5, "chickens" ), Tuple.Create( 1, "airplane" ) };
难道没有更好的方法吗?我希望有类似于字典初始化器的解决方案。
Dictionary<int, string> students = new Dictionary<int, string>() { { 111, "bleh" }, { 112, "bloeh" }, { 113, "blah" } };
我们不能使用类似的语法吗?
admin 更改状态以发布 2023年5月21日
是的!这是可能的。
集合初始化器的 { } 语法适用于任何具有带有正确数量参数的 Add 方法的 IEnumerable 类型。不必烦恼它在内部如何工作,这意味着您可以简单地扩展自 List
,添加一个自定义的 Add 方法来初始化您的 T,然后完成操作!
public class TupleList: List > { public void Add( T1 item, T2 item2 ) { Add( new Tuple ( item, item2 ) ); } }
这允许您执行以下操作:
var groceryList = new TupleList{ { 1, "kiwi" }, { 5, "apples" }, { 3, "potatoes" }, { 1, "tomato" } };
c# 7.0可以帮助你实现这个:
var tupleList = new List<(int, string)> { (1, "cow"), (5, "chickens"), (1, "airplane") };
如果你不需要一个 List
,只需要一个数组,你可以这样做:
var tupleList = new(int, string)[] { (1, "cow"), (5, "chickens"), (1, "airplane") };
如果你不喜欢"Item1"和"Item2",你可以这样做:
var tupleList = new List<(int Index, string Name)> { (1, "cow"), (5, "chickens"), (1, "airplane") };
或者针对一个数组:
var tupleList = new (int Index, string Name)[] { (1, "cow"), (5, "chickens"), (1, "airplane") };
这样你就可以这样做:tupleList [0].Index
和tupleList [0].Name
Framework 4.6.2 及以下版本
你必须从 Nuget Package Manager 安装 System.ValueTuple
。
Framework 4.7 及以上版本
它内置于框架中。不要安装System.ValueTuple
。实际上,删除它并从 bin 目录中删除它。
注:在现实生活中,我可能无法在牛、鸡或飞机之间做出选择。我会非常心疼。