Сравнение значений в одном столбце DataTable - PullRequest
0 голосов
/ 30 октября 2019

У меня есть данные, которые я прочитал из CSV. Я хотел бы найти все повторяющиеся имена в одной строке с именем «name» и добавить их в другую таблицу для последующего использования. Код, который у меня есть:

private DataTable MatcherTable(DataTable table)
    {

        DataTable match = new DataTable();

        match = table.Clone();

        var equalRows = table.Rows.Cast<DataRow>().Where(dataRow => dataRow["name"] == dataRow["name"]).ToList();

        foreach (var equalRow in equalRows)
        {
            match.Rows.Add(equalRow.ItemArray);
        }

        return match;
    }

Однако, когда я возвращаю таблицу, которая должна быть полна совпадений, она возвращает ту же самую таблицу, в которой я читал. Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Код просто копирует все данные в выходной таблице, потому что выражение сравнения сравнивает одну и ту же строку и столбец с самим собой.

Вы можете решить проблему с помощью одного выражения Linq

private DataTable MatcherTable(DataTable table)
{
    DataTable match = table.Rows.Cast<DataRow>()
                           .GroupBy(x => x["Name"])
                           .Where(g => g.Count() > 1)
                           .Select(k => k.FirstOrDefault())
                           .CopyToDataTable();
    return match;
}

Здесь мы группируем строки, используя значение в столбце «Имя», и отфильтровываем все группы с числом вхождений менее 2. Затем мы берем первую строку из группы и строим последовательность Датарова, окончательно скопированную в выходную таблицу.

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

    DataTable match = table.Rows.Cast<DataRow>()
                           .GroupBy(x => x["Name"])
                           .Where(g => g.Count() > 1)
                           .SelectMany(k => k)
                           .CopyToDataTable();
0 голосов
/ 30 октября 2019

Создайте пустой список, чтобы вы могли это сделать

List<string> names= new List<string>();
foreach(var row in table.Rows)
{
  if(names.Contains(row["name"])
  {
  names.Add(row["name"].ToString());
  }
else
{
   DataRow dr = match.NewDataRow();
   dr.ItemArray=row.ItemArray; match.Rows.Add(dr);
}
}

У меня могут быть некоторые ошибки в правописании или в smt, но это просто, чтобы дать вам идею!

...