dri*_*iis 64 .net c# arrays multidimensional-array
我刚刚注意到C#中的多维数组没有实现IEnumerable<T>,而它确实实现了IEnumerable.对于一维数组,这两个IEnumerable<T>和IEnumerable来实现.
为何如此区别?如果是一个多维数组IEnumerable,它肯定也应该实现通用版本?我注意到了这一点,因为我试图在多维数组上使用扩展方法,除非你使用Cast<T>或类似,否则会失败; 所以我绝对可以看到实现多维数组的论据IEnumerable<T>.
为了澄清我的问题在代码中,我希望下面的代码打印true的四倍,而它实际打印true,false,true,true:
int[] singleDimensionArray = new int[10];
int[,] multiDimensional = new int[10, 10];
Debug.WriteLine(singleDimensionArray is IEnumerable<int>);
Debug.WriteLine(multiDimensional is IEnumerable<int>);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 47
CLR有两种不同的数组:保证为一维且下限为0的向量,以及可以具有非零边界和非0的等级的更一般的数组.
从CLI规范的第8.9.1节:
此外,元素类型为T的创建向量实现接口
System.Collections.Generic.IList<U>(第8.7节),其中U:= T.
我不得不说这对我来说似乎很奇怪.鉴于它已经实现,IEnumerable我不明白为什么它不应该实现IEnumerable<T>.它实现起来并没有多大意义IList<T>,但简单的通用接口会很好.
如果你想要这个,你可以调用Cast<T>(如果你使用的是.NET 3.5)或编写自己的方法来迭代数组.为了避免强制转换,你必须编写自己的方法,找到每个维度的下限/上限,并以这种方式获取东西.不是非常愉快.
Jad*_*ias 14
有一种解决方法:您可以将任何多维数组转换为IEnumerable
public static class ArrayExtensions
{
public static IEnumerable<T> ToEnumerable<T>(this Array target)
{
foreach (var item in target)
yield return (T)item;
}
}
Run Code Online (Sandbox Code Playgroud)
零边界一维数组同时实现IEnumerable和IEnumerable<T>,但不幸的是,多维数组只实现IEnumerable。@Jader Dias 的“解决方法”确实将多维数组转换为,IEnumerable<T>但成本巨大:数组的每个元素都将被装箱。
这是一个不会对每个元素造成装箱的版本:
public static class ArrayExtensions
{
public static IEnumerable<T> ToEnumerable<T>(this T[,] target)
{
foreach (var item in target)
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20224 次 |
| 最近记录: |