2017-02-18 3 views
2

У меня есть список дубликатов имен, и я хочу получить список без дубликатов.GroupBy для удаления дубликатов из списка объектов IEnumerable

CSVCategories = from line in File.ReadAllLines(path).Skip(1) 
          let columns = line.Split(',') 
          select new Category 
          { 
           Name = columns[9] 
          }; 

      var results = CSVCategories.GroupBy(x => x.Name) 
         .Select(g => g.FirstOrDefault()) 
         .ToList(); 

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

foreach(var item in results) 
{ 
    Console.WriteLine(item.Name); 
} 
+2

Похожие сообщения: http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq или http://stackoverflow.com/questions/37850167/delete-duplicates-in- a-list-of-int-arrays/37850231 # 37850231 –

ответ

0

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

E.g. Мой первоначальный список CSVCategories содержал элементы: [ "Home", "дом", "EmptyString", "дом", "Город", "Город", "Парк"]

Когда де-множительной с GroupBy, возвращаемый запрос results [«Главная», «Дом», «ПустойString», «Город», «Парк»], поэтому он вроде работал. Сохранение значений, которые пусты, и те, которые имеют другой корпус.

Теперь мне нужно найти способ удаления дубликатов корпусов и пустых строк.

0

Linq не поощряет неизменность так это никогда изменяет входную коллекцию. Таким образом, Distinct() возвращает новую коллекцию, а модифицировал сборник inline. Попробуйте:

foreach(var item in CSVCategories.Distinct()) 
    { 
     Console.WriteLine(item.Name); 
    } 
+0

Цикл foreach предназначен только для целей отладки. Как вы думаете, я должен добавить элементы в новый список в цикле, чтобы получить отдельный список? – naz786

+0

Да. Если вы присвоите результат Distinct() переменной (новой или существующей), вы получите уникальную коллекцию. Не нужно вызывать ToList() перед вызовом Distinct() – stt106

1

Вызов Distinct не работает, скорее всего потому, что ваш класс Категория не имеет надлежащего осуществления Equals и GetHashCode.

У вас есть два варианта. Правильно перепишите методы Equals и GetHashCode или используйте Hashset, чтобы проверить, не добавлено ли имя.

var uniqueNames = new Hashset<string>(); 

// Original select statement 

CSVCategories = CSVCategories.Where(x => uniqueName.Add(x.Name)).ToList(); 
+0

'let columns = line.Split (',')' предполагает, что 'columns' являются' string [] 'поэтому' columns [9] 'is' string'. – stt106

+0

Вы забыли выбрать новую категорию {Name = columns [9]} –

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