У меня есть таблица данных, которая содержит много повторяющихся строк. Мне нужно отфильтровать эти строки из таблицы данных на основе нескольких столбцов, чтобы получить отдельные строки в итоговой таблице данных...
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 нет строк
Способ 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();
Это происходит потому, что вы удаляете строки.
Если вы хотите сохранить тот же алгоритм, вместо использования while (rowIndex < i)
используйте эту форму цикла:
for (var rowIndex = rows.Count - 1; rowIndex >= 0; rowIndex--)
{
...
if (uniqueness.Contains(sb.ToString()))
{
rows.Remove(row);
rowIndex--;
}
...
}
dt = dt.AsEnumerable().GroupBy(r => new { Field1 = r.ItemArray[0], Field2 = r.ItemArray[1] }).Select(g => g.First()).CopyToDataTable();