2015-09-14 6 views
1

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

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

Можно ли это сделать?

public class Record 
{ 
    public int Id { get; set; } 
    public string Name{ get; set; } 
    public string Address{ get; set; } 
} 

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

var query = record.GroupBy(s => s.name).Where(s => s.Count() > 1); 
+3

посмотреть на HTTP://stackoverflow.com/questions/3811464/how-to-get-duplicate-items-from-a-list-using-linq – Terence

+0

@Jannik s Должен ли я буквально набирать p.Значение или что-то еще? –

+0

@Johnny: Вы можете посмотреть мой ответ, я только что протестировал обновленный ответ. – Jannik

ответ

3

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

Просто сделай это:

var query = 
    record 
     .GroupBy(s => s.Name) 
     .Where(s => s.Count() > 1) 
     .SelectMany(r => r); 

Итак, если я начну с этим:

var record = new[] 
{ 
     new { Id = 1, Name = "Joe", Address = "X" }, 
     new { Id = 2, Name = "Barry", Address = "Y"}, 
     new { Id = 3, Name = "Joe", Address = "A"}, 
     new { Id = 4, Name = "Mike", Address = "B"}, 
     new { Id = 5, Name = "Barry", Address = "B"}, 
     new { Id = 6, Name = "Joe", Address = "B"}, 
}; 

я выберусь это:

query

+0

Это будет работать, но вы потеряете группировку, не так ли? Edit: \\ oops забудьте об этом – Jannik

+1

OP сказал, что хочет вывести дубликаты в таблицу. Я думал, что это самый подходящий способ сделать это. – Enigmativity

+0

Да, я понял, не имеет смысла держать группировку в любом случае: P – Jannik

-1

Это должно работать (не проверено):

var grouped = record.GroupBy(s => s.Name).Where(s => s.Count() > 1); 
var result = grouped.SelectMany(c => c.Select(p => p.Address)); 
0

следующие работы для меня:

var query = records.GroupBy(s => s.Name) 
     .Where(s => s.Count() > 1) 
     .SelectMany(x => x.Select(y => new Record{ Id = y.Id, Name = y.Name, Address = y.Address})); 

Тест с

var records = new [] { 
      new Record {Address = "A", Id = 1, Name = "Tim"}, 
      new Record {Address = "B", Id = 2, Name = "Tim"}, 
      new Record {Address = "C", Id = 3, Name = "Tim"}, 
      new Record {Address = "D", Id = 4, Name = "Hans"} 
     }; 

Получает первые три Records по имени Tim.

+0

Это просто un-группирует данные ... –

+0

@AshleyMedway Нет, я протестировал его, он удаляет «Ганс» из записей. – HimBromBeere

0

Есть два способа приближения к этому:

  1. Выходные дублируют для каждой группы
  2. Загрузить все дубликаты в одной таблице и показать им все

Для первой вещи все, что вам нужно необходимо выполнить перебор по сгруппированным записям:

var duplicates = records.GroupBy(r => r.Name) 
         .Where(g => g.Count() > 1); 
foreach(var duplicateGroup in duplicates) 
{ 
    Console.WriteLine("Duplicates for: {0}", duplicateGroup.Key); 
    foreach(var item in duplicateGroup) 
    { 
     Console.WriteLine("Id: {0}, Address: {1}", item.Id, item.Address); 
    } 
} 

Код ab ove будет выводить Name дубликатов, а затем значения Id и Address для каждой записи в дублирующей группе.

Если вы хотите, чтобы загрузить все дубликаты в таблице (например, экспортировать их в файл Excel) необходимо использовать следующее:

var duplicates = records.GroupBy(r => r.Name) 
         .Where(g => g.Count() > 1) 
         .SelectMany(g => g.ToArray()); 
foreach(var duplicate in duplicates) 
{ 
    Console.WriteLine("Name: {0}, Id: {1}, Address: {2}", duplicate.Name, duplicate.Id, duplicate.Address); 
} 

Этот фрагмент кода будет выводить только дублей с дублировать Name в первом столбце, чтобы было легче просмотреть записи.

Смежные вопросы