如何将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另一个列表!
THE END
二维码