如何将List<List<Int32>>的初始化简化为IEnumerable<IEnumerable<Int32>>?

c#

我正在做以下集合初始化:

Int32[,] v1 = new Int32[2, 2] { { 1, 2 }, { 3, 4 } };

IEnumerable<IEnumerable<Int32>> v2 = new List<List<Int32>> { { 2, 3 }, { 3, 4 } };

在第二行我得到错误:

No overload for method 'Add' takes 2 arguments

有没有办法使用最新的 C# 版本为主集合中的每个项目创建一个IEnumerable<IEnumerable<Int32>>而不添加new List<Int32>

IEnumerable<IEnumerable<Int32>> v2 = new List<List<Int32>> { 
  new List<Int32> { 2, 3 }, 
  new List<Int32> { 3, 4 } 
};

回答

无需编写包装器List<List<T>>

集合初始值设定项只是调用Add由对象List<T>声明的Add方法的语法糖,并没有声明采用 2 个参数(或大于 1 的任意数量的参数)的方法。

但是,集合初始值设定项也将调用名为Add. 这意味着我们可以这样写:

public static class ListExtensions
{
     public static void Add<T>(this List<List<T>> list, params T[] items)
     {
         list.Add(new List<T>(items));
     }
}

然后让我们写:

IEnumerable<IEnumerable<int>> collection = new List<List<int>>()
{
    { 1, 2 },
    { 3, 4 },
};

看到它在这里工作。


值得注意的是,这种Add方法只能作为扩展方法添加——无法List<T>自行声明。这样做的原因是只有当列表包含其他列表时才有意义,并且无法定义仅适用于某些类型列表的实例方法。但是,您可以在扩展方法上添加像这样的各种限制。您可以编写一个扩展方法,List<T>该方法仅适用于T类,或者实际上仅适用于T另一个列表!


以上是如何将List&lt;List&lt;Int32&gt;&gt;的初始化简化为IEnumerable&lt;IEnumerable&lt;Int32&gt;&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>