Могу ли я преобразовать одномерный массив строк в одномерный массив столбцов данных? - PullRequest
0 голосов
/ 11 ноября 2019

Я сгруппировал столбец с помощью запроса linq и выбрал массив столбцов значений из столбца. Теперь я хочу добавить все имена, которые есть в этом массиве, в новую переменную Datatable, которую я создал. Это пустой Datatable. Поэтому я использую Datatable.columns.addrange метод. Этот метод требует массив datacolumn. Можно ли преобразовать массив строк в массив столбцов данных и добавить значения в массив строк в виде столбцов в моем пустом Datatable? Спасибо за ваше время

1 Ответ

1 голос
/ 11 ноября 2019

Может быть проще / более читабельно сделать:

foreach(string s in stringarray)
    datatable.Columns.Add(s);

Но вы можете попробовать:

datatable.Columns.AddRange(
  stringarray.Select(s=>new DataColumn(s)).ToArray()
);

Проблема с этим последним методом заключается в том, что писать дольше,менее читабелен и менее эффективен, так что это своего рода проигрыш-проигрыш. Проблема обоих этих методов заключается в том, что вы не можете указать тип столбца, если только вы не собираетесь проверять имя и, например, делать любое имя, заканчивающееся на «Time», датой и т. Д.

Лучший способ использования datatable a - это набор данных со строгой типизацией, добавленный в проект, и сами таблицы данных, разработанные во время разработки, с типами столбцов, ограничениями, отношениями, выражениями и т. Д.

В vb.net это было бы что-токак:

DT2.Columns.AddRange(gg.Select(Function(r) new DataColumn(CStr(r("Plant")))).ToArray())

Это еще более нечитаемая мерзость, чем:

For Each r as Thing in gg
  DT2.Columns.Add(CStr(r("Plant")))

Итак, мы, наконец, дошли до того, что вы ставите нам актуальную проблему: вы хотитегруппа на заводе, применить агрегирование к другому столбцу, и вы хотите повернуть его, чтобы ваши строки стали столбцами. Это будет примерно так:

    'generate a datatable with dummy data
    Dim dt As New DataTable()
    dt.Columns.Add("Plant")
    dt.Columns.Add("SumMe")
    dt.Rows.Add("Rose", 1)
    dt.Rows.Add("Rose", 2)
    dt.Rows.Add("Tulip", 3)


    Dim groups = dt.AsEnumerable() _
                  .GroupBy(Function(r) New With {Key .Plant = CStr(r("Plant"))}) _
                  .Select(Function(grp) New With {Key grp.Key.Plant, .SumOf = grp.Sum(Function(ro) CInt(ro("SumMe")))})

    'for results
    Dim dt2 As New DataTable()
    dt2.Columns.Add("x")
    dt2.Rows.Add("x")

    For Each group In groups
        dt2.Columns.Add(group.Plant)
        dt2.Rows(0)(group.Plant) = group.SumOf
    Next group

Я прошел путь foreach;если вы отчаянно хотите использовать AddRange, несмотря на оговорки о проигрыше-проигрыше, о которых упоминалось ранее (и на этот раз это будет еще сложнее, потому что вам придется превратить группирование в массив и добавить столбцы, а затем выполнить его внекоторая форма для хранения значений в результате dt) Я оставлю это в качестве упражнения для вас:)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...