【问题标题】:How do I remove objects with a combination of duplicate of two properties from List with linq?如何使用 linq 从 List 中删除两个属性的重复组合的对象?
【发布时间】:2019-06-01 00:09:39
【问题描述】:

this one 相同的问题,但我需要从 List 中删除具有两个属性的重复组合的对象。

有一组对象,对象有年龄和名称:

21 Carl
23 Vladimir
25 Bob
21 Olivia
21 Carl
30 Jacob
23 Vladimir

输出列表应包含:

21 Carl
23 Vladimir
25 Bob
21 Olivia
30 Jacob

如何删除它?

【问题讨论】:

标签: c# list linq duplicates


【解决方案1】:

试试这个:

  public class KeyValueClass
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

    private void DoTheJob()
    {

        var myList = new List<KeyValueClass>
        {
            new KeyValueClass {Age = 21, Name = "Carl"},
            new KeyValueClass {Age = 23, Name = "Vladimir"},
            new KeyValueClass {Age = 25, Name = "Bob"},
            new KeyValueClass {Age = 21, Name = "Olivia"},
            new KeyValueClass {Age = 21, Name = "Carl"},
            new KeyValueClass {Age = 30, Name = "Jacob"},
            new KeyValueClass {Age = 23, Name = "Vladimir"},
        };

        var myDistinctList = myList.GroupBy(x => new { x.Age, x.Name })
            .Select(c => c.First()).ToList();
    }

【讨论】:

    【解决方案2】:

    只需使用 ISet 即可避免 List 的开销和性能下降:

    public class Person : IEquatable<Person> 
    {
        public int Age { get; private set;}
        public string Name { get; private set;}
    
        public bool override Equals(Person other){
            return other.Age == Age && other.Name.Equals(Name);
        }
    
        public override int GetHashCode(){
            return Age.GetHashCode() ^ Name.GetHashCode();
        }
    }
    
    private IEnumerable<Person> MakeUniqueList(IEnumerable<Person> input){
        return new HashSet<Person>(input);
    }
    

    为了真正删除,这会降低性能(但会节省内存使用),请使用 List.Remove(T) https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.remove?view=netframework-4.7.2

    【讨论】:

      【解决方案3】:

      您可以使用 Linq 命名空间中的 Distinct() 和 IEqualityComparer:

      class Program
      {
          static void Main(string[] args)
          {
      
      
              List<KeyValueClass> myList = new List<KeyValueClass>
                  {
                      new KeyValueClass {Age = 21, Name = "Carl"},
                      new KeyValueClass {Age = 23, Name = "Vladimir"},
                      new KeyValueClass {Age = 25, Name = "Bob"},
                      new KeyValueClass {Age = 21, Name = "Olivia"},
                      new KeyValueClass {Age = 21, Name = "Carl"},
                      new KeyValueClass {Age = 30, Name = "Jacob"},
                      new KeyValueClass {Age = 23, Name = "Vladimir"},
                  };
      
              var myDistincList = myList.Distinct(new KeyValueEqualityComparer());
      
              foreach (var item in myDistincList) { Console.WriteLine("Age: {0}, Name:{1}", item.Age, item.Name); }
      
              Console.ReadKey();
          }
      }
      
      
      public class KeyValueClass 
      {
          public int Age { get; set; }
          public string Name { get; set; }
      }
      
      
      
      class KeyValueEqualityComparer : IEqualityComparer<KeyValueClass>
      {
          public bool Equals(KeyValueClass x, KeyValueClass y)
          {
              if (x == null || y == null) return false;
              if (x.Age == y.Age && x.Name.Equals(y.Name)) return true;
              return false;
          }
      
          public int GetHashCode(KeyValueClass obj)
          {
              return (obj.Age + obj.Name).GetHashCode() + 387;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-29
        • 2012-04-17
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2019-12-12
        相关资源
        最近更新 更多