удалить дубликаты предметов из коллекции, кроме ее первого появления - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть коллекция типов строки, которая может содержать любое количество элементов.

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

Например,

 public class CollectionCategoryTitle
    {
        public long CollectionTitleId { get; set; }
        public bool CollectionTitleIdSpecified { get; set; }
        public string SortOrder { get; set; }
        public TitlePerformance performanceField { get; set; }      
        public string NewOrder { get; set; }    
    }

    List<CollectionCategoryTitle> reorderTitles = 
        (List<CollectionCategoryTitle>)json_serializer
            .Deserialize<List<CollectionCategoryTitle>>(rTitles);

Теперь мне нужно обработать эту коллекцию так, чтобы она удаляла дубликаты, но она должна сохранять 1-е вхождение.

РЕДАКТИРОВАТЬ:

Я обновил код и мне нужно сравнить свойство NewOrder

Спасибо

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

Для вашего конкретного случая:

var withoutDuplicates = reorderTitles.GroupBy(z => z.NewOrder).Select(z => z.First()).ToList();

В более общем случае Distinct () обычно предпочтительнее. Например:

        List<int> a = new List<int>();
        a.Add(4);
        a.Add(1);
        a.Add(2);
        a.Add(2);
        a.Add(4);

        a = a.Distinct().ToList();

вернет 4, 1, 2. Обратите внимание, что Distinct не гарантирует порядок возвращаемых данных (текущая реализация, похоже, возвращает их на основе порядка исходных данных - но это недокументировано и, следовательно, не следует полагаться).

3 голосов
/ 11 ноября 2011

Используйте для этого метод расширения Enumerable.Distinct<T>().

2 голосов
/ 11 ноября 2011

РЕДАКТИРОВАТЬ: mjwills правильно указывает, что гарантированный порядок важен в этом вопросе, поэтому другие два предложения не гарантированно работают. Оставляя только ту, которая дает эту гарантию.

private static IEnumerable<CollectionCategoryTitle> DistinctNewOrder(IEnumerable<CollectionCategoryTitle> src)
{
  HashSet<string> seen = new HashSet<string>();
  //for one last time, change for different string comparisons, such as
  //new HashSet<string>(StringComparer.CurrentCultureIgnoreCase)
  foreach(var item in src)
    if(seen.Add(item.NewOrder))
      yield return item;
}
/*...*/
var distinctTitles = reorderTitles.DistinctNewOrder().ToList();

Наконец, используйте .ToList() только после вызова DistinctNewOrder(), если вам действительно нужно, чтобы он был списком. Если вы собираетесь обработать результаты один раз, а затем больше не работать, лучше не создавать список, который тратит время и память.

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