当前位置: 首页 > 知识库问答 >
问题:

为什么C#多维数组不实现IEnumerable?

充煌
2023-03-14

我刚刚注意到,C#中的多维数组没有实现IEnumerable ,而它实现了IEnumerable。对于单维数组,同时实现IEnumerable IEnumerable

为什么会有这种差别?如果多维数组是IEnumerable,那么它是否也应该实现泛型版本?我注意到这一点,是因为我试图在多维数组上使用扩展方法,除非您使用cast 或类似的方法,否则会失败;所以我可以肯定地看到使多维数组实现IEnumerable 的一个参数。

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

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);

共有2个答案

蓟雪峰
2023-03-14

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

public static class ArrayExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this Array target)
    {
        foreach (var item in target)
            yield return (T)item;
    }
}
艾凌龙
2023-03-14

CLR有两种不同的数组:一种是保证一维的向量,下界为0,另一种是更一般的数组,它们可以有非零界和不是0的秩。

根据CLI规范第8.9.1节:

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

我不得不说这对我来说很奇怪。鉴于它已经实现了IEnumerable,我不明白为什么它不应该实现IEnumerable 。实现ilist 没有那么大的意义,但是使用简单的泛型接口就可以了。

如果您想这样做,您可以调用cast (如果您使用的是.NET3.5),或者编写自己的方法来迭代数组。为了避免强制转换,您必须编写自己的方法,找到每个维度的下界/上界,并以这种方式获取内容。不是很愉快。

 类似资料:
  • 主要内容:1、二维数组,2、初始化二维数组,3、访问二维数组种的元素C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储,因此也被称为矩阵。 要创建多维数组,我们需要在声明数组的方括号内添加逗号,例如: int[,] arr=new int[3,3];         // 声明一个二维数组 int[,,] arr=new int[3,3,3];     // 声明一个三维数组  1、二维数组

  • C++ 数组 C++ 支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4]; 二维数组 多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:

  • 问题内容: 我正在将某些东西从Java移植到C#。在Java中,a 取决于其中的项目。在C#中,我总是从… 获取相同的哈希码。 为什么是这样? 对于我的某些对象,哈希码必须有所不同,因为其list属性中的对象使对象不相等。我希望哈希码对于对象的状态始终是唯一的,并且仅在对象相等时才等于另一个哈希码。我错了吗? 问题答案: 为了正常工作,散列码必须是不可变-一个对象的散列码必须 永远不会 改变。 如

  • 问题内容: 对于那些不需要背景知识的人来说,TL; DR版本是以下特定问题: Java为什么没有真正的多维数组的实现?有可靠的技术理由吗?我在这里想念什么? 背景 Java在语法级别具有多维数组,因为它可以声明 但这似乎并不是人们所期望的。它不是让JVM分配足够大的RAM来存储100 s 的连续内存块,而是以s 的数组数组的形式出现:因此,每一层都是RAM的连续内存块,但总体而言不是。因此,访问速

  • 本文向大家介绍python numpy 一维数组转变为多维数组的实例,包括了python numpy 一维数组转变为多维数组的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 借助numpy库; 以上这篇python numpy 一维数组转变为多维数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1: