icavs Ответов: 2

Группируйте различные записи в столбце


Всем Привет,

Можете ли вы помочь в том, как это сделать с помощью linq in vb.net-что?
Столбцы Datatable1 должны быть сгруппированы так же, как результат Datatable2.

Объект datatable1

ID# |   НАЗВАНИЕ | ОТДЕЛ
E12345 | Joe | HR
E12345 | Joe | HR
E12345 | Joe | HR
T54333 | Фред | ИТ
T54333 | Фред | ИТ
I22544 | Кейт | ПТ
I22544 | Кейт | ПТ

Ожидаемый результат
Datatable2
ИД | НАЗВАНИЕ | ОТДЕЛ
E12345 | Joe | HR
T54333 | Фред | ИТ
I22544 | Кейт | ПТ

Что я уже пробовал:

Попробовал ниже код, но имя столбца, DEPT имеет результат системной ошибки.

Dim dt As DataTable = New DataTable()
        dt.Columns.AddRange(New DataColumn() _
            {
                New DataColumn("ID#", Type.GetType("System.String")),
                New DataColumn("Name", Type.GetType("System.String")),
                New DataColumn("Dept", Type.GetType("System.String"))
            })

        dt.Rows.Add(New Object() {"E12345", "Joe", "HR"})
        dt.Rows.Add(New Object() {"E12345", "Joe", "HR"})
        dt.Rows.Add(New Object() {"E12345", "Joe", "HR"})
        dt.Rows.Add(New Object() {"T54333", "Fred", "IT"})
        dt.Rows.Add(New Object() {"T54333", "Fred", "IT"})
        dt.Rows.Add(New Object() {"I22544", "Kate", "AC"})
        dt.Rows.Add(New Object() {"I22544", "Kate", "AC"})

        Dim groupID = dt.AsEnumerable() _
        .GroupBy(Function(x) x.Field(Of String)("ID#")) _
        .Select(Function(grp) New With
               {
                    .ID = grp.Key,
                    .Name = grp.Select(Function(x) x.Field(Of String)("Name")),
                    .Dept = grp.Select(Function(x) x.Field(Of String)("Dept"))
               }) _
            .ToList()

        Dim dtF As DataTable = dt.Clone()

        For Each item In groupID
            Dim dr = dtF.NewRow()
            'dr("ID#") = item.ID
            'dr("Name") = item.Name
            dtF.Rows.Add(item.ID, item.Name, item.Dept)
        Next

        DataGridView1.DataSource = dtF

2 Ответов

Рейтинг:
20

Maciej Los

Вам нужно добавить FirstOrDefault() метод получения одного имени и отдела вместо списка из них.

Dim groupID = dt.AsEnumerable() _
.GroupBy(Function(x) x.Field(Of String)("ID#")) _
.Select(Function(grp) New With
       {
            .ID = grp.Key,
            .Name = grp.Select(Function(x) x.Field(Of String)("Name")).FirstOrDefault(),
            .Dept = grp.Select(Function(x) x.Field(Of String)("Dept")).FirstOrDefault()
       }) _
    .ToList()


icavs

Ты такой замечательный @Maciej Los.
Это работает! Большое спасибо.

Maciej Los

Всегда пожалуйста.

Рейтинг:
1

Member 8653884

var distinctObj = клиент.Выберите(m => new {m.Удостоверение личности, m.Name,м. отдел}).Отчетливый().Список();


Maciej Los

Что ж...
Этот вопрос был помечен как: VB.net, но(!) вы показали пример в c#.