2014-11-11 5 views
1

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

Barcode Itemid PacktypeId 

1  100  1 

1  100  2 

1  100  3 

1  100  1 

1  100  3 

нужно только те строки, которые содержит packtypeid 1,2,3 оставшиеся 4-й и 5-й строки должны быть удалены

Я попытался с помощью двух методов, но никто не делал не получается для лучшего результата

таблица данных содержит более 10 столбцов, но Уникальный столбец является «Штрих-код», «ItemID», «PackTypeID»

Способ-1:

dt_Barcode = dt_Barcode.DefaultView.ToTable(true, "Barcode", "ItemID", "PackTypeID"); 

Описанный выше метод фильтра строки, но он возвращает столбцы только 3 значения столбцов мне нужно целых 10 значений столбцов.

Method-2: 
        List<string> keyColumns = new List<string>(); 
        keyColumns.Add("Barcode"); 
        keyColumns.Add("ItemID"); 
        keyColumns.Add("PackTypeID"); 
      RemoveDuplicates(DataTable table, List<string> keyColumns) 
      { 
      var uniqueness = new HashSet<string>(); 
      StringBuilder sb = new StringBuilder(); 
      int rowIndex = 0; 
      DataRow row; 
      DataRowCollection rows = table.Rows;    
      int i = rows.Count; 
      while (rowIndex < i) 
      { 
       row = rows[rowIndex]; 
       sb.Length = 0; 
       foreach (string colname in keyColumns) 
       { 
        sb.Append(row[colname]); 
        sb.Append("|"); 
       } 

       if (uniqueness.Contains(sb.ToString())) 
       { 
        rows.Remove(row); 
       } 
       else 
       { 
        uniqueness.Add(sb.ToString()); 
        rowIndex++; 
       } 
       } 

Описанный выше метод возвращает исключение, что нет ни одной строки в положении 5

ответ

2

Метод 3:

Вместо Стараясь выше 2 методов я нашел этот Linq метод что-то очень полезный

 dt_Barcode = dt_Barcode.AsEnumerable().GroupBy(r => new { ItemID = r.Field<Int64>("ItemID"), PacktypeId = r.Field<Int32>("PackTypeID") }).Select(g => g.First()).CopyToDataTable(); 
+0

Спасибо за это приятное решение! Я не доверяю методу 1, который иногда уходит навсегда и не возвращается. –

0

Это происходит потому, что вы удаляете строки.

Если вы хотите сохранить тот же алгоритм, вместо того, чтобы использовать while (rowIndex < i) использовать эту форму петли:

for (var rowIndex = rows.Count - 1; rowIndex >= 0; rowIndex--) 
{ 
    ... 

    if (uniqueness.Contains(sb.ToString())) 
    { 
     rows.Remove(row); 
     rowIndex--; 
    } 
    ... 
} 
+1

@Pradeep, пожалуйста, отредактируйте ваш вопрос, чтобы я мог предоставить ответ на то, что вы задаете сейчас, а не на исходный вопрос. – galenus

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