Удалить список структур по полю - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть список в C #, этот список содержит структуры, я хотел бы удалить повторяющиеся структуры, но только структуры, которые имеют некоторые равные поля. Как я могу сделать? ТНХ

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Есть два возможных решения:

  1. Удалить дубликаты вручную: имеется в виду перебор списка с вложенным циклом.
  2. Назначьте для структуры хеш-код и проверку на равенство и используйте Hashset<YourStruct> для удаления дубликатов. Это можно сделать с помощью пользовательской реализации IEqualityComparer ( link ) или, если вы "владеете" структурой, реализовав интерфейс IEquatable с соответствующим переопределением GetHashCode и Equals.

Если ваш набор небольшой, и эту операцию нужно выполнить один раз в вашем коде, я бы выбрал первое решение. Но если эта логика сравнения используется снова и снова, я бы выбрал решение два.

Реализация для решения два:

    struct YourStruct
    {
       public int Id; 
    }

    class Comparer : IEqualityComparer<YourStruct>
    {

      public bool Equals(YourStruct a, YourStruct b)
      {
        return a.Id == b.Id;
      }


      public int GetHashCode(YourStruct s)
      {
        return s.Id;
      }

    }

    List<YourStruct> list = new List<YourStruct>();

    HashSet<YourStruct> hs = new HashSet<YourStruct>(list, new Comparer());
0 голосов
/ 06 сентября 2011
List<Sample> samples = new List<Sample>(new[]
{
    new Sample {Id = 1},
    new Sample {Id = 1},
    new Sample {Id = 2},
    new Sample {Id = 3},
    new Sample {Id = 1}
});

var duplicates = samples
    .Select    ((s, i) => new { s.Id, Index = i })  // Get item key and index
    .GroupBy   (s => s.Id)                          // Group by Key
    .Where     (g => g.Count() > 1)                 // Get duplicated ones
    .SelectMany(g => g.Skip (1)                     // We'll keep first one
                      .Select(i => i.Index))        // Get other items ids
    .Reverse();
foreach (var index in duplicates)
{
    samples.RemoveAt(index);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...