当前位置:  开发笔记 > 编程语言 > 正文

为什么C#多维数组没有实现IEnumerable <T>?

如何解决《为什么C#多维数组没有实现IEnumerable<T>?》经验,为你挑选了2个好方法。

我刚刚注意到C#中的多维数组没有实现IEnumerable,而它确实实现了IEnumerable.对于一维数组,这两个IEnumerableIEnumerable来实现.

为何如此区别?如果是一个多维数组IEnumerable,它肯定也应该实现通用版本?我注意到了这一点,因为我试图在多维数组上使用扩展方法,除非你使用Cast或类似,否则会失败; 所以我绝对可以看到实现多维数组的论据IEnumerable.

为了澄清我的问题在代码中,我希望下面的代码打印true的四倍,而它实际打印true,false,true,true:

int[] singleDimensionArray = new int[10];
int[,] multiDimensional = new int[10, 10];

Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);
Debug.WriteLine(singleDimensionArray is IEnumerable);
Debug.WriteLine(multiDimensional is IEnumerable);

Jon Skeet.. 47

CLR有两种不同的数组:保证为一维且下限为0的向量,以及可以具有非零边界和非0的等级的更一般的数组.

从CLI规范的第8.9.1节:

此外,元素类型为T的创建向量实现接口 System.Collections.Generic.IList (第8.7节),其中U:= T.

我不得不说这对我来说似乎很奇怪.鉴于它已经实现,IEnumerable我不明白为什么它不应该实现IEnumerable.它实现起来并没有多大意义IList,但简单的通用接口会很好.

如果你想要这个,你可以调用Cast(如果你使用的是.NET 3.5)或编写自己的方法来迭代数组.为了避免强制转换,你必须编写自己的方法,找到每个维度的下限/上限,并以这种方式获取东西.不是非常愉快.



1> Jon Skeet..:

CLR有两种不同的数组:保证为一维且下限为0的向量,以及可以具有非零边界和非0的等级的更一般的数组.

从CLI规范的第8.9.1节:

此外,元素类型为T的创建向量实现接口 System.Collections.Generic.IList (第8.7节),其中U:= T.

我不得不说这对我来说似乎很奇怪.鉴于它已经实现,IEnumerable我不明白为什么它不应该实现IEnumerable.它实现起来并没有多大意义IList,但简单的通用接口会很好.

如果你想要这个,你可以调用Cast(如果你使用的是.NET 3.5)或编写自己的方法来迭代数组.为了避免强制转换,你必须编写自己的方法,找到每个维度的下限/上限,并以这种方式获取东西.不是非常愉快.



2> Jader Dias..:

有一种解决方法:您可以将任何多维数组转换为IEnumerable

public static class ArrayExtensions
{
    public static IEnumerable ToEnumerable(this Array target)
    {
        foreach (var item in target)
            yield return (T)item;
    }
}


这与`IEnumerable.Cast `相同.
@smirkingman或[`IEnumerable.OfType `](https://msdn.microsoft.com/en-us/library/bb360913)
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有