Я новичок в С#, и я не могу найти пример этого нигде (хотя я видел похожие примеры, но кастинг был ToString, тогда как в моем случае я хочу массивы целых чисел). У меня есть объект DataTable,
DataTable results = dbCon.ExecuteQuery("my query");
int m = results.Rows.Count;
int n = results.Columns.Count;
Я хочу Невыровненный массив, состоящий из п одномерных массивов (каждый массив будет столбцом DataTable (results
, в данном случае).
int[][] jagged = new int[n][];
for (int i = 0; i < n; i++)
{
jagged[i] = new int[m];
//var coli = results.Columns.Cast<Array>().Select(column => Convert.ToInt32(column)).ToArray();
//jagged[i] = coli;
}
Я пробовал несколько вещей (например, что я прокомментировал), но я сейчас застрял.
Если кто-нибудь знает, как это сделать, напишите что-нибудь! Благодарю!
Кроме того, чтобы быть более конкретным, я бы очень хотел использовать такую функцию, как тот, который NumPy предоставляет Python... dataSet = np.array(dataList).astype('float')
. Двойной для циклов не в моих интересах, так как мой DataTable большой.
Я думаю, вам также нужно создать массив типа объекта. DataTable
DataRow
держит вещи типа object
, поэтому это то, что вам нужно хранить их в вашем зубчатым массиве.
Я думаю, что это сработает:
DataTable table = dbCon.ExecuteQuery("my query");
int rowCount = table.Rows.Count;
int colCount = table.Columns.Count;
object[][] objs = new object[colCount][];
for (int currentColumn = 0; currentColumn < colCount; currentColumn++)
{
objs[currentColumn] = new object[rowCount];
for (int currentRow = 0; currentRow < rowCount; currentRow++)
{
objs[currentColumn][currentRow] = table.Rows[currentRow][currentColumn];
}
}
MessageBox.Show(objs[1][1].ToString());
Я получаю законное значение из зубчатого массива. Если вам не нравится двойной цикл for
вы всегда можете разбить его на два разных вызова методов - каждый с циклом for
. Таким образом, по крайней мере, выглядит лучше ..
break
в коде после заполнения зубчатого массива, посмотрите на массив и посмотрите, есть ли в нем значения. Таким образом, вы можете по крайней мере сказать, происходит ли ваша проблема, когда вы отображаете значение или когда значение заполняется ..
Думаю, у вас уже есть это. Пытаться:
results.Rows[rowIndex][columnIndex]
Чтобы получить его в массив с зазубрингом, вы можете перейти на простой цикл:
for (int i = 0; i < results.Rows.Count; i++)
{
for (int j = 0; j < results.Columns.Count; j++)
{
jagged[i][j] = results.Rows[i][j];
}
}
Вы можете получить то, что хотите, просто используя LINQ для DataTable
. Для каждого столбца в DataTable
вам необходимо выполнить итерацию по строкам и выбрать этот столбец. Вы должны вызвать Cast()
для Select()
в столбцах и AsEnumerable()
чтобы иметь возможность Select()
в строках:
int[][] jagged = results.Columns.Cast<DataColumn>()
.Select(
col => results.AsEnumerable()
.Select(row => row.Field<int>(col))
.ToArray()
).ToArray();
DataTable
, которые не являются int
. Вы можете отфильтровать столбцы с помощью .Where(...)
перед первым выбором, чтобы получить только те столбцы, которые вам нужны.