【问题标题】:Implement IEnumerable jagged array which returns transposed item实现返回转置项的 IEnumerable 锯齿状数组
【发布时间】:2018-08-16 14:43:10
【问题描述】:

我自己也试过这样做,真是让人头疼……

我希望能够从T[key1][key2] 使用LINQ 到Select,它实际上“看到”T[key2][key1](即转置矩阵)。我想这样做的原因是我不必手动转置数组项(这很慢),而是提供即时转置的数组项。

不确定这是否可能!

编辑:添加此功能的示例:

T[][]T[,] .Select(item => item),其中item 的类型为T[],作为第N 个枚举数位置的集合。

int[,] matrix = new int[2,2] {{1, 2}, {3, 4}};
matrix = matrix.Select(item => item); //Where .Select magically transposes
//Matrix is now {{1, 3}, {2, 4}}

【问题讨论】:

  • 你能举例说明你的意思吗?
  • LINQ 不能那样工作。它不了解锯齿状数组的概念。我将使用 Transpose() 方法创建一个 Matrix 类型,该方法返回一个带有转置值的新 Matrix 对象。另外,当您说“这很慢”时,我不确定您的意思。您的意思是实施缓慢还是执行缓慢?
  • 所以,目前,我正在使用一些代码首先就地转置整个数组,然后在此集合上使用 LINQ。转置对我很有用,因为我想对 key2 的平均值,而不是 key1 的平均值。我想要完成的是 LINQ 的枚举器,它枚举“交换”的键。

标签: c# linq matrix transpose ienumerator


【解决方案1】:

要编写代码以转置顺序遍历数组,您只需编写代码以正常遍历数组即可; IEnumerable 的数组实现使用了什么,但不是遍历外部循环中的最低维度和内部循环中的更高维度,而是将它们反转:

public static IEnumerable<T> TraverseTransposed<T>(this T[,] array)
{
    for (int j = 0; j < array.GetLength(1); j++)
        for (int i = 0; i < array.GetLength(0); i++)
            yield return array[i, j];
}

【讨论】:

  • 嗨,不幸的是,我不太确定如何在我的情况下使用它。例如,我有T[,] 我想从.Select(item =&gt; item) 来,其中item 的类型为T[] 作为第N 个枚举数位置的集合。
  • 那么听起来你宁愿拥有锯齿状数组,而不是二维数组。
  • 是的,在标题中,尽管item 将是T[]
  • @Patrick 您专门将您的代码显示为二维数组,而不是锯齿状数组。但无论如何,如果你想返回整个数组,而不仅仅是序列,它就违背了不仅仅是转置整个事物的目的。拥有一个迭代器的整个想法,而不是只是将整个事情预先转置,是为了避免将所有数据复制到另一个结构中,如果你需要一个数组而不是IEnumerable&lt;T&gt;,你就不能这样做。
  • 我很确定 T[][] 是锯齿状的,T[,] 多维...我想要一个迭代器而不是手动转置的原因是为了避免这种情况——我可以用 for 循环“选择”很容易,通过使用T[key2][key1],我想为 LINQ 提供迭代器来执行此操作。请参阅我在 Q 中编辑的示例。
【解决方案2】:

这就是你的意思吗(它很慢吗?):

var items = new int[,] {
   {1,2,3,4,5,6},
   {10,20,30,40,50,60},
   {100,200,300,400,500,600},
};  

var transposed = new int[items.GetLength(1), items.GetLength(0)];

for (int row = 0; row < items.GetLength(0); row++)
{
    for (int col = 0; col < items.GetLength(1); col++)
    {
       transposed[col,row]  = items[row,col];
    }
}

【讨论】:

  • 没有必要将整个数组复制到一个新数组中,只是为了以不同的顺序遍历它。这需要 O(n) 内存,而不是 O(1) 内存。
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2015-01-03
  • 2015-09-23
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多