【问题标题】:Passing one Dimension of a Two Dimensional Array in C#在 C# 中传递二维数组的一维
【发布时间】:2012-03-02 09:23:10
【问题描述】:

我已经从 C 迁移到 C#。 我有一个接受数组的函数。我想将二维数组的一维传递给这个函数。

C 代码将是:-

void array_processing(int * param); 

void main()
{
  int Client_ID[3][50];
  /* Some 
     Processing 
     which fills 
     this array */
    array_processing(&Client_ID[1]);
}

现在,当我想在 C# 中做同样的事情时,如何传递这个数组? 函数定义如下:-

private void array_processing(ref int[] param);

和 Array 将被声明为:-

int[,] Client_ID = new int[3,50];

现在如何将Client_ID[1] 传递给函数array_processing()??

通过 array_processing ( ref Client_ID[1]) 喊“错误的索引数量”!

【问题讨论】:

    标签: c# multidimensional-array


    【解决方案1】:

    你真的不能那样做。 C# 的数组不太外向,并且阻止您进行类似 C 的操作。这是一件好事。

    您有多种选择:

    1. 创建一维数组并将二维行复制到其中。
    2. 使用锯齿状数组 - 数组的数组,这更像 C 让您做的事情。
    3. 有一个 array_processing 重载,它接受一个二维数组和一个行号。

    4. 如果您真的想要以一维数组的形式访问二维行,您应该创建一个“RowProxy”类,该类将实现 IList 接口并让您只访问一行:

      class RowProxy<T>: IList<T>
      {
          public RowProxy(T[,] source, int row)
          { 
             _source = source;
             _row = row;
          }
      
          public T this[int col]
          {
              get { return _source[_row, col]; } 
              set { _source[_row, col] = value; }
          }
      
          private T[,] _source;
          private int _row;
      
          // Implement the rest of the IList interface
      }
      
    5. 使用会丢失数组语义的 lambda 表达式,但相当酷:

      var ClientId = ...;
      
      var row_5_accessor = (c=>ClientId[5, c]);
      

      你可以使用row_5_accessor作为一个函数,row_5_accessor(3)会给你ClientId[5, 3]

    【讨论】:

    • 对于像我这样的新手来说,这已经超出了我的想象!会一一尝试....但是这个C#让我失望了...它就是不能通过多维数组! C 摇滚!!:)
    • 不,不,您可以毫无问题地传递多维数组。将多维数组视为向量是不可能的。另一方面,C 语言中的任何内容都没有提供接近我的建议 4 和 5 的灵活性。
    • 噢!谢谢,兄弟!!是的,第四和第五真的很好!再次感谢!
    • @zmbq:你说“这是件好事”。为什么?以这种方式限制语法有什么好处?不安全的代码可以解决这个问题吗?
    • C 多维数组非常令人困惑。如果你有一个 3x3 矩阵:int a[3][3],那么 a[2] 的类型是什么?
    【解决方案2】:

    你可以使用锯齿状数组

    // Initialize jagged array
    int[][] clientID = new int[3][];
    for (int i=0; i<clientId.Length; i++)
    {
       clientId[i] = new int[50];
    }
    
    array_processing(ref clientId[1]);
    

    还有你的方法:

    private void array_processing(ref int[] subArray);
    

    【讨论】:

      【解决方案3】:

      只需声明方法

      private void ParseArray(int[,] ar)
      {
          // Some work...
      }
      
      • UDP:代码格式

      【讨论】:

      • 他想传递一维而不是所有矩阵
      • 但我只想在函数中处理一维!在这种情况下,我需要写类似 private void ParseArray(int[,]ar,int dimension) 然后传递 ParseArray(ref Client_ID,1)
      • 对不起,那是星期五晚上 :)
      【解决方案4】:

      一种原始的方式是:

      var dimNumber = 1;
      
      int[] oneDimension = new int[50];
      
      for(var i=0; i<50; i++)
      {
         oneDimension[i] = Client_ID[dimNumber][i];
      }
      
      array_processing ( ref oneDimension);
      

      我建议使用 Lambda 表达式,如 zmbq 的回答中的方式 5。

      【讨论】:

        【解决方案5】:

        你可以将你的数组声明为

        int[][] Client_ID = new[] { new int[50], new int[50], new int[50] };
        

        然后你可以将它传递给你的 array_processing 函数

        array_processing(ref Clinet_ID[1]);
        

        对不起,我的笔没了。

        【讨论】:

        • 首先,多维数组不能这样声明,我尝试了同样的方法,但它给出的错误是“错误的索引数”。我在问题中提到了这一点。
        • 对不起,我改变了声明,你可以使用上面的符号
        【解决方案6】:

        讨论晚了,但这里有一个锯齿状数组示例可以做到这一点:

        string[][] rows = GetStringArray(values);
        string[] row = rows[0];
        

        您将设置您的锯齿状数组,如下所示:

        // rowCount from runtime data
        stringArray = new string[rowCount][];
        
        for (int index = 0; index < rowCount; index++)
        {
            // columnCount from runtime data
            stringArray[index] = new string[columnCount];
        
            for (int index2 = 0; index2 < columnCount; index2++)
            {
                // value from runtime data
                stringArray[index][index2] = value;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-04-20
          • 2013-01-02
          • 1970-01-01
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 2015-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多