2010-08-08 3 views
0

У меня есть datatable, который имеет один текстовый столбец «Заголовок», который может иметь несколько значений с дубликатами. Я могу удалить дубликаты с помощью dataview.Получение дубликатов для каждого отдельного значения из datatable

DataView v = new DataView(tempTable); 
tempTable = v.ToTable(true, "Title"); 

Но как я могу получить количество дубликатов для каждого отдельного значения без каких-либо циклов?

ответ

1

Если вы не хотите использовать петлю или использовать Linq, так что нет никакого способа сделать это, но вы можете использовать вычисленный столбец в таблице данных с еще одним условием, если это применимо с вами. То есть данные должны быть в двух связанных таблицах, подобных этому.

DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"], data.Tables["Orders"].Columns["customerid"]); 
data.Relations.Add(rel); 

Учитывая, что поле customerid является внешним ключом в таблице заказов, оно имеет дубликаты. Вы можете получить счетчик копий таким образом:

data.Tables["Customers"].Columns.Add("Duplicates", 
    GetType(Decimal), "Count(child.customerid)"); 
0

Как я хотел бы получить результаты, которые вы хотите будет выглядеть примерно так:

tempTable.Rows.Cast<DataRow>() 
    .Select(dr => Convert.ToString(dr[0])) 
    .GroupBy(dr => dr) 
    .Select(g => new { Title = g.Key, Count = g.Count() }); 

Однако, это на самом деле зацикливание под капотом. На самом деле, я не могу придумать способ сделать такую ​​группировку без проверки каждой записи.

Недостатком является то, что результатом этого выражения является последовательность экземпляров анонимного типа. Если вы все еще хотите, чтобы результат был DataView, вы можете переписать последний выбор, чтобы создать новый DataRow с двумя столбцами и вставить их в новый DataTable, который вы передадите DataView.

+1

Я не благословляюсь использовать Linq. – NLV

+0

Вы можете заменить 'tempTable.Rows.Cast ()' с 'tempTable.AsEnumerable()' –

Смежные вопросы