如何轻松初始化一个元组列表?

7 浏览
0 Comments

如何轻松初始化一个元组列表?

我喜欢使用元组,它们可以使你快速地将相关信息组合在一起,而无需编写相应的结构体或类。这对于重构非常局部化的代码非常有用。

但是初始化它们的列表似乎有些多余。

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日
0
0 Comments

是的!这是可能的

集合初始化器的 { } 语法适用于任何具有带有正确数量参数的 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" }
};

0
0 Comments

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 目录中删除它。

注:在现实生活中,我可能无法在牛、鸡或飞机之间做出选择。我会非常心疼。

0