Объявление массива строк с использованием цикла for

Мне нужно объявить 32 строковых массивов, содержащих массивы в C#. Написание всего этого работает нормально, примерно так:

string[] row1 = new string[] { "NO.", "DATA BIN", "BIT2", "BIT1", };
string[] row2 = new string[] { "1", DataBin[1], BitLabels[1, 1], BitLabels[0, 1], };
string[] row3 = new string[] { "2", DataBin[2], BitLabels[1, 2], BitLabels[0, 2], };
string[] row4 = new string[] { "3", DataBin[3], BitLabels[1, 3], BitLabels[0, 3], }; 

Но было бы намного чище / проще, если бы я мог создать их так:

string[] row1 = new string[] { "NO.", "DATA BIN", "BIT2", "BIT1", };
for (int i = 2; i < 33; i++)
{
string[] row(i) = new string[] { Convert.ToString(i), DataBin[i], BitLabels[1, i], BitLabels[0, i], };
}

Проблема в том, что я не могу проиндексировать имя экземпляра (например, row1)

Это для DataGridView, поэтому мне также нужно кое-что позаботиться о следующем:

object[] rows = new object[] { row1 , row2 , row3 , row4 , row5 , row6 , row7 , row8 , row9 ,
                               row10 , row11 , row12 , row13 , row14 , row15 , row16 , row17 ,
                               row18 , row19 , row20 , row21 , row22 , row23 , row24 , row25 ,
                               row26 , row27 , row28 , row29 , row30 , row31 , row32 , row33 };            
foreach (string[] rowArray in rows)
        {
            myDataGridView.Rows.Add(rowArray);
        }

Какие-либо предложения? (простите за правку)

4 ответа

Решение

Похоже, вы почти получили это. Ответ массива хороший. Другой возможный подход - использовать список. Вы можете преобразовать список в массив позже, если это необходимо. Как видите, код чистый и понятный.

var rows = new List<string[]>();
for (int i = 0; i < 32; i++)
{
    var row = new string[] { Convert.ToString(i), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i], };
    rows.Add(row);
}

// use rows.ToArray() if you need it to be an array or arrays later.

Вы можете использовать многомерный ([,]) или зубчатый ([][]) массив.

Исходя из вашего примера, я бы пошел для неровных (массив массивов):

string[][] rows = new string[32][];

for (int i = 0; i < rows.Length; i++)
{
    int n = i+1;  // you seem to use 1 as origin
    rows [i] = new string[] { n.ToString(), DataBin[n], ... };
}

Изменить: это для DataGridView, так что...

Таким образом, вы не можете использовать массив (для столбцов), вам нужен правильный класс. С именами свойств для привязки. Вам также не нужен массив для строк (для ограничения).

Простой способ добраться из того места, где вы находитесь, куда вам нужно - это использовать анонимный класс:

(Заимствуя кусок у Тима)

var rows = Enumerable.Range(1, 32)
     .Select(i => new {   // this is the anon class
         Index = i.ToString(),   // on-the-fly property 'Index'
         Text1 = DataBin[i], 
         Text2 = BitLabels[2, i], 
         Text3 = BitLabels[1, i],  /* etc */ }
       );

И тогда вы можете привязать ваши столбцы к Index, Text1, Text2 и т. Д.

Может быть, вы хотите использовать Linq:

string[][] rows = Enumerable.Range(1, 32)
    .Select(i => new [] { i.ToString(), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i], })
    .ToArray();

Вы могли бы использовать List<string[]>для образца:

var rows = new List<string[]>();

for (int i = 0; i < 32; i++)
{
   rows.Add(new string[] { Convert.ToString(i), DataBin[i], BitLabels[2, i], BitLabels[1, i], BitLabels[0, i] });
}

После этого можно было бы использовать rows объект и доступ по

rows[0][3]

Где первый индекс является элементом списка, а второй индекс является индексом массива.

Вы также можете позвонить ToArray() и получить массив string[],

Другие вопросы по тегам