2

文字列を多次元 int マップに書き込もうとしています。

1,1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1,1

ええ、あなたはそれが何のためにあるのかほとんど推測できます。衝突マップ。とにかく、この情報はファイルに保存されます。今、私はファイルを取得し、変換し、何とか何とかしました。コードを表示して、どこに問題があるかを示します。おそらくその方が簡単です。

// Convert a string to multi-dim int array,
// format: 1,1,1,1|1,0,0,1|1,1,1,1|
private int[,] ConvertToMapArray(String data) 
{
    // Split to iterate rows and get row count.
    string[] rows = data.Split('|');

    // Initialize return data.
    int[,] ret;

    // Set row count to 0, increment each loop.
    int rc = 0;

    foreach (string row in rows)
    {
        // Split each number and iterate. Convert to int32 and and store in its own int array.
        string[] items = row.Split(',');

        // Initialize int array with proper row count.
        int[] newRow = new int[ items.Count() ];

        // Count set to 0 for foreach iteration, must increment.
        int ic = 0;

        foreach (string item in items )
        {
            // Convert string to int.
            int i int.Parse(item);

            // Add to newRow int array.
            newRow[ic++] = i;
        }

        // Add new int row to return multi-dim array.
        ret[rc++] = newRow;   /// <--- this doesnt work
    }

    return ret;
}
4

3 に答える 3

2

Rectangular配列ではなく(2次元)配列がありますJagged。これらの配列タイプについては、こちらで学習できます。

int[,] ret; //Rectangular array.

このような値を割り当てる必要があります

ret[0,0] = 1;

したがってfor loop instead of foreach、インデックスまたは行と列を取得するために使用する必要があります。

于 2012-11-13T05:39:59.653 に答える
2

C# では、行全体を多次元配列に割り当てることはできません。配列の配列ではありません。次のいずれかを行う必要があります。

  1. 行と列の両方にret直接割り当てます。たとえば、次のように置き換えnewRow[ic] = iますret[rc, ic] = i

  2. 多次元配列の代わりにジャグ配列を使用します。ジャグ配列は配列の配列です。したがって、行全体をそれに割り当てることができます。のように

:

int[][] ret = new int[numberOfRows][];
...
ret[rc] = newRow;
于 2012-11-13T05:51:54.030 に答える
1

ret多次元配列として宣言しましたが、それをジャグ配列として使用しています。宣言を次のように変更します。

int[][] ret = new int[rows.Length][];

そして、楽しみのために、すべてを 1 つの Linq クエリに減らすことができます。

private int[][] ConvertToMapArray(String data) 
{
    return data.Split(new [] {'|'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(row => row.Split(',')
                                 .Select(item => {int i; Int32.TryParse(item, out i); return i;})
                                 .ToArray())
               .ToArray();
}

または、もう少し読みやすく:

private int[][] ConvertToMapArray(String arrayData) 
{
    var rowDelimiter = new [] {'|'};
    return arrayData.Split(rowDelimiter, StringSplitOptions.RemoveEmptyEntries)
                    .Select(row => ConvertToMapRow(row))
                    .ToArray();
}

private int[] ConvertToMapRow(String rowData) 
{
    return row.Split(',')
              .Select(item => 
                  {
                      int i; 
                      Int32.TryParse(item, out i); 
                      return i;
                  })
              .ToArray();
}
于 2012-11-13T05:38:58.740 に答える