Как мне преобразовать DataTable в зубчатый массив в C #?

1

Я новичок в С#, и я не могу найти пример этого нигде (хотя я видел похожие примеры, но кастинг был 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 большой.

  • 0
    У каждой строки разное количество столбцов? Или вы хотите превратить содержимое столбца в массив целых чисел?
  • 0
    У меня есть n столбцов, каждый из которых содержит по m строк .. в основном я просто хочу матрицу Но я читал статью о производительности и о том, что зубчатые массивы лучше всего подходят для умножения матриц. heatonresearch.com/content/...
Теги:
numpy
datatable
jagged-arrays

3 ответа

2
Лучший ответ

Я думаю, вам также нужно создать массив типа объекта. 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];
    }
}
  • 0
    Я не знаю о Python - но я знаю, что когда я делаю это: MessageBox.Show(objs[1][1].ToString()); Я получаю законное значение из зубчатого массива. Если вам не нравится двойной цикл for вы всегда можете разбить его на два разных вызова методов - каждый с циклом for . Таким образом, по крайней мере, выглядит лучше ..
  • 0
    Вместо того, чтобы извлекать значение в вашу программу, попробуйте поставить break в коде после заполнения зубчатого массива, посмотрите на массив и посмотрите, есть ли в нем значения. Таким образом, вы можете по крайней мере сказать, происходит ли ваша проблема, когда вы отображаете значение или когда значение заполняется ..
Показать ещё 2 комментария
0

Думаю, у вас уже есть это. Пытаться:

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];
    }
}
0

Вы можете получить то, что хотите, просто используя 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();
  • 0
    Я хотел бы использовать ваш пост, потому что таблица, из которой я запрашиваю, очень большая, поэтому двойные циклы не в моих интересах. Но я попробовал это и получил InvalidCastException. Проблема, кажется, в row => row.Field <int>. Возможно, вы что-то пропустили в своем посте, или я неправильно использую ваш пост. На самом деле, я просто хотел бы сделать что-то вроде пакета NumPy, который позволяет вам делать на Python (то есть dataSet = numpy.array (dataList) .astype ('float'))
  • 0
    @ eTothEipiPlus1 Я думаю, у вас есть дополнительные столбцы в вашей DataTable , которые не являются int . Вы можете отфильтровать столбцы с помощью .Where(...) перед первым выбором, чтобы получить только те столбцы, которые вам нужны.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню