Объявление массива строк с использованием цикла 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[]
,