【发布时间】:2014-06-04 02:25:54
【问题描述】:
我主要使用 C# 进行编程,但这似乎适用于所有 .NET。
我的情况是,使用多维数组似乎是最合乎逻辑的事情,但我觉得使用它们让我无法使用 .NET。
-
System.LINQ不适用于多维数组。 (ETA:但请参阅 Nico Schertler 的评论) -
System.Array的实用方法在处理多维数组方面非常有限。 -
似乎没有任何方法可以为多维数组编写扩展方法。(ETA:这是错误的,请参阅 Nico Schertler 的评论) - 几年前,多维数组的速度要慢得多——现在仍然如此吗? Why are multi-dimensional arrays in .NET slower than normal arrays?(ETA:是的,请参阅 Tim S 的回答)
我知道我可以选择使用扁平数组,但这与数据并不匹配。我也知道我可以选择循环遍历所有维度并进行复制,但是当语言和编译器很智能时,这似乎是一种古老的做事方式。所以我的问题是:
- 是否有一种标准方法可以将 LINQ(或等效功能)与多维数组(将二维数组转换为数据库或
List<Tuple>)一起使用? - 是否有标准方法来分割多维数组(返回单个超曲面或一系列超曲面)?
- 排序。我找到了C# rectangular array sort;但这并不适用,因为我确实提前知道了尺寸。
ETA:我说的是在 C# 中声明为 double[,] dataTable = new double[5,3]; 的“原生”数组类型,而不是锯齿状数组或任何其他嵌套类。
【问题讨论】:
-
您可以为多维数组编写扩展方法。例如。我最近实现了
IEnumerable<double> Linearize(this double[,] arr)。通过这样的扩展方法,您可以使用最常见的 LINQ 方法而没有很多开销。 -
@Nico 您可以这样做,但您必须为每个等级编写单独的扩展方法。没有办法编写一个适用于所有等级的扩展方法。
-
为什么这个问题没有立即关闭,因为它是基于意见的?是否可以用(非任意选择的)事实来回答这个问题?
-
@AnotherParker 我建议您在问题中非常清楚您的要求并删除任何基于意见的内容。到目前为止,我支持我的近距离投票(基于意见)。对于您的第二个子问题,我仍然认为过于宽泛。我很欣赏这个问题的精神,但我认为它不适合这个网站。
-
CLR 没有针对 MD 阵列进行优化,尽管这显然是可能的。为什么?根据我的经验,MD 阵列非常罕见。我宁愿拥有非常快的 SZ 阵列和慢速 MD 阵列,也不愿两者都同样快。为什么要将资金投入到非常很少使用的功能领域?我刚刚搜索了 150 KLOC 的代码驱动生产网站,我唯一能找到 MD 数组的地方是在 levenshtein 距离的代码中。