Ответ 1
Попробуйте этот запрос -
DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
Для получения дополнительной информации нажмите ссылку ниже -
Надеюсь, это помогло бы вам.
В моем проекте есть два типа данных dtFail
и dtFailed
(dtFailed
не имеет ничего, кроме объявлений имен столбцов). dtFail
имеет повторяющиеся значения столбца "EmployeeName". поэтому я взял dataview dvFail
и сделал процесс, чтобы сделать их отличными, как показано в приведенном ниже коде:
dtFail
Я попробовал код ниже:
DataView dvFail = new DataView(dtFail);
dtFail = dvFail.ToTable(true, "EmployeeName"); //showing only one column in dtFail
dtFailed (только один столбец)
Если мне нравится ниже
DataView dvFail = new DataView(dtFail);
dtFail = dvFail.ToTable(true, "EmployeeName","EmployeeRole","Status");
dtFailed (показывается только с повторяющимися строками)
Затем datatable dtFailed
также хранит дубликат "EmployeeName".
Пожалуйста, помогите
Спасибо в Advance.
Попробуйте этот запрос -
DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
Для получения дополнительной информации нажмите ссылку ниже -
Надеюсь, это помогло бы вам.
РЕШЕНИЕ 1:
Основываясь на вопросе, который я понимаю, нам нужно рассмотреть дубликаты на основе EmployeeName, и нам не нужно беспокоиться о других столбцах. Если это так, то решение работает лучше.
foreach(DataRow r in dtFail.AsEnumerable())
{
if (!dt1.AsEnumerable().Any(r1 => r1["EmployeeName"] == r["EmployeeName"]))
{
// if you don't want to copy entire row create new DataRow
// with required fields and add that row.
dt1.Rows.Add(r.ItemArray);
}
}
если вы хотите, вы можете вернуть dt1 обратно в dtFail.
РЕШЕНИЕ 2:
Если нам нужно рассмотреть отдельные строки, я предпочитаю ниже решение.
var temp = dtFail.AsEnumerable().Distinct();
dtFail = temp.CopyToDataTable();
Я не уверен, что это будет полезно или нет. Насколько я понял из вашего вопроса, что вы хотите, чтобы EmployeeName
отличался от других столбцов. Но если вы сделаете ToTable
и включите отдельный флаг, он даст все отдельные строки, неважно, сколько там столбцов. Поэтому, если вы упомянете только имя EmployeeName, оно, очевидно, даст вам отличные имена EmployeeNames, а не все связанные с ним столбцы.
Итак, вот что я сделал, изначально выбираем только отдельные столбцы EmployeeName
и помещаем их в temt DataTable dtt.
DataTable dtt = dvFail.DefaultView.ToTable(true, "EmployeeName");
Во-вторых, я создал другую временную таблицу DataTable, где мы помещаем выделенные строки из основного DataTable dtFail и задаем имена столбцов вручную.
DataTable TempDataTable = new DataTable();
DataTable dtFailed = new DataTable();
Подготовьте столбцы в dtFailed DataTable.
if (dtFailed.Columns.Count == 0)
{
dtFailed.Columns.Add("EmployeeName");
dtFailed.Columns.Add("EmployeeRole");
dtFailed.Columns.Add("Status");
dtFailed.Columns.Add("Date");
}
Пройдите через отдельный DataTable EmployeeName dtt и сопоставьте имя EmployeeName и сохраните выбранную строку first
в TempDataTable. Наконец, все строки переданы в dtFailed.
for (int j = 0; j < dtt.Rows.Count; j++)
{
string EmployeeName = dtt.Rows[j]["EmployeeName"].ToString();
TempDataTable = dvFail.Select("EmployeeName = " + EmployeeName).CopyToDataTable();
dtFailed.Rows.Add(TempDataTable.Rows[0].ItemArray);
}