Удаление повторяющихся строк из таблицы данных на основе нескольких столбцов

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 нет строк

Теги:
datatable
dataview

2 ответа

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

Способ 3:

Вместо Trying выше 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
    Спасибо! Также вы можете использовать с индексом столбца без указания типа T: dt = dt.AsEnumerable().GroupBy(r => new { Field1 = r.ItemArray[0], Field2 = r.ItemArray[1] }).Select(g => g.First()).CopyToDataTable();
0

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

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

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

    if (uniqueness.Contains(sb.ToString()))
    {
        rows.Remove(row);
        rowIndex--;
    }
    ...
}
  • 1
    @Pradeep, пожалуйста, отредактируйте свой вопрос, чтобы я мог дать ответ на то, что вы спрашиваете сейчас, а не на исходный вопрос.

Ещё вопросы

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