c# Как найти повторяющиеся записи в наборе данных, который содержит много таблиц данных? - PullRequest
0 голосов
/ 21 января 2020

У меня есть DataSet, который содержит много DataTables (по крайней мере, одна таблица, может быть гораздо больше). Есть ли простой способ проверить весь набор данных на наличие дублирующихся записей? Под дубликатом я имею в виду: каждая таблица представляет объект Student и имеет три столбца: StudentId, StudentName и NumberId (в этом проекте студенты могут принадлежать Numbers). Мне нужен способ узнать, существует ли один и тот же Студент в двух или более таблицах, то есть один и тот же Студент отображается в нескольких строках любой из таблиц?
Я пробовал -

protected void CheckForDuplicateStudents()
{
DataSet setStudents = new DataSet();
foreach (GridViewRow gvr in grdNumbers.Rows)//grdNumbers on html page
    {
        int numberId = int.Parse(grdNumbers.DataKeys[gvr.RowIndex].Value.ToString());

        //for each row in the grid, get the student enrollent as a dt
        //put each dt into the dset
        DataTable tblRoster = PerformanceAccess.GetStudentsInNumber(numberId);

        setStudents.Tables.Add(tblRoster);
    } 

var duplicatedRowsExist = dsetStudents.Tables[0].AsEnumerable()
                           .GroupBy(r => r, DataRowComparer.Default)
                           .Any(g => g.Count() > 1);`

//do stuff here if query returns any duplicate records
}

Но, насколько я понимаю, этот запрос LINQ (и аналогичный) проверяет только дублированные значения в пределах одной таблицы данных, а не во всех таблицах в наборе.

Есть ли прямой способ сделать это?

РЕДАКТИРОВАТЬ - я должен уточнить, каждая таблица будет иметь несколько строк, где каждая строка представляет студента

`

Ответы [ 2 ]

0 голосов
/ 27 января 2020

привет, вы можете использовать (отличный метод)

var duplicatedRowsExist = dsetStudents.Tables[0].AsEnumerable().GroupBy(r => r, DataRowComparer.Default).Any(g => g.Count() > 1).distinct()
0 голосов
/ 27 января 2020

Ваш вопрос немного скучен по деталям, но если мы работаем с набором допущений:

  • У вас есть набор данных с N таблицами
  • Все таблицы имеют столбец StudentID типа int
  • Вы хотите обнаружить определенные повторяющиеся целые числа

Следующий код оставит вас со списком, который цитирует все повторяющиеся строки:

HashBag<int> idx = new HashBag<int>();
List<DataRow> dupRows = new List<DataRow>();

foreach(DataTable dt in dataset.Tables)
{
  foreach(DataRow dr in dt.Rows)
  {
    int sid = (int)dr["StudentID"];
    if(idx.Contains(sid))
      dupRows.Add(dr);
    else
      idx.Add(sid);
  }
}

DataRows имеют ссылки на таблицу, в которой они живут, поэтому, если вам нужна ссылка на таблицу данных, в которой обитает конкретная строка, позвоните, например, dupRows[0].Table

Если вы хотите первую строку, а также все дубликаты вместо этого рассмотрим словарь:

Dictionary<int, DataRow> idx = new Dictionary<int, DataRow>();
List<DataRow> dupRows = new List<DataRow>();

foreach(DataTable dt in dataset.Tables)
{
  foreach(DataRow dr in dt.Rows)
  {
    int sid = (int)dr["StudentID"];
    if(idx.Contains(sid))
      dupRows.Add(dr);
    else
      idx[sid] = dr;
  }
}

Теперь словарь содержит первую найденную строку, а список содержит все ее дубликаты

...