【问题标题】:String.join on one dimension of a 2 dimensional arrayString.join 二维数组的一维
【发布时间】:2017-02-16 02:28:53
【问题描述】:

我想用 string.Join() 打印我的二维数组的一行,但我找不到有效的方法。当然我可以用一个简单的 for 循环来做到这一点,但如果有办法做到这一点会很有趣。

编辑我说的是普通的多维数组:

int[,] multidimensionalArray= new int[,];

【问题讨论】:

  • 你是如何声明你的数组的 - int [,]int[][]
  • @dana 修复了它。

标签: c# multidimensional-array


【解决方案1】:

无法从正确的二维数组中分离出一行。如果它是一个锯齿状数组,那么解决方案将是显而易见的。

因此,如果使用数组的行对您来说很重要,那么您可以考虑将其转换为锯齿状数组。

否则,如果此操作不是最重要的,那么循环是最不打扰的方式。

您可以选择为此添加一个简单的扩展方法,这样就可以解决整个问题:

public static class ArrayExtensions
{
    public static IEnumerable<T> GetRow<T>(this T[,] array, int rowIndex)
    {
        int columnsCount = array.GetLength(1);
        for (int colIndex = 0; colIndex < columnsCount; colIndex++)
            yield return array[rowIndex, colIndex];
    }
}

这将使您可以选择仅处理一行:

IEnumerable<int> row = array.GetRow(1);

例如,您可以在一行代码中从矩阵中打印一行:

Console.WriteLine(string.Join(", ", array.GetRow(1).ToArray()));

【讨论】:

  • 非常有趣,这可能会非常方便,谢谢。:D
【解决方案2】:

Zoran Horvat 的回答很好,如果我只需要读取数组,我就会这样做。

如果你还需要写数组,你可以这样做:

struct ArrayRow<T> // Consider implementing IEnumerable<T>
{
  T[,] array;
  int row;
  public ArrayRow(T[,] array, int row) 
  { 
    this.array = array; 
    this.row = row;
  }
  public T this[int i]
  {
    get { return this.array[this.row, i]; }
    set { this.array[this.row, i] = value; }
  }
  public int Length 
  {
    get { return this.array.GetLength(1); }
  }
  public IEnumerable<T> Items ()
  {
    int c = this.Length;
    for (int i = 0; i < c; ++i)
      yield return this[i];
  }
}

static class Extensions 
{
  public static ArrayRow<T> GetRow<T>(this T[,] array, int row)
  {
    return new ArrayRow<T>(array, row);
  }
}

现在你有了一个看起来像一维数组的东西,它实际上写入你的二维数组:

var myRow = myArray.GetRow(10);
myRow[20] += 30;
string.Join(",", myRow.Items());

等等。

【讨论】:

    【解决方案3】:

    不知道您是否认为这比for 循环更有效或更易读,但您可以这样做:

    string s = string.Join(separator,
                           Enumerable.Range(0, multidimentionalarray.GetLength(1))
                                     .Select(column => multidimentionalarray[row, column]));
    

    【讨论】:

    • 是的,如果这是唯一的方法,请坚持使用 for 循环:D
    • 在这种情况下,维度 0 不会给你行而不是列吗?
    • @Shimmy 你是什么意思?它包括在内。
    • 我不明白,row 变量来自哪里?
    • 我所做的是我使用了Select 的重载,它采用Func&lt;TSource, int, TResult&gt;,其中中间的int 表示当前的迭代索引。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2013-11-23
    • 2010-11-17
    • 2013-05-19
    • 1970-01-01
    • 2016-04-15
    • 2016-12-27
    • 2018-11-20
    相关资源
    最近更新 更多