Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq从列表中删除具有两个重复属性组合的对象?_C#_List_Linq_Duplicates - Fatal编程技术网

C# 如何使用linq从列表中删除具有两个重复属性组合的对象?

C# 如何使用linq从列表中删除具有两个重复属性组合的对象?,c#,list,linq,duplicates,C#,List,Linq,Duplicates,问题与相同,但我需要从列表中删除具有两个重复属性组合的对象 有一组对象,对象具有年龄和名称: 21 Carl 23 Vladimir 25 Bob 21 Olivia 21 Carl 30 Jacob 23 Vladimir 输出列表应包含: 21 Carl 23 Vladimir 25 Bob 21 Olivia 30 Jacob 如何删除它?尝试以下操作: public class KeyValueClass { public int Age { get; s

问题与相同,但我需要从列表中删除具有两个重复属性组合的对象

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

21 Carl
23 Vladimir
25 Bob
21 Olivia
21 Carl
30 Jacob
23 Vladimir
输出列表应包含:

21 Carl
23 Vladimir
25 Bob
21 Olivia
30 Jacob
如何删除它?

尝试以下操作:

  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();
    }
公共类KeyValueClass
{
公共整数{get;set;}
公共字符串名称{get;set;}
}
私人职位空缺职位()
{
var myList=新列表
{
新的KeyValueClass{Age=21,Name=“Carl”},
新的KeyValueClass{Age=23,Name=“Vladimir”},
新的KeyValueClass{Age=25,Name=“Bob”},
新的KeyValueClass{Age=21,Name=“Olivia”},
新的KeyValueClass{Age=21,Name=“Carl”},
新的KeyValueClass{Age=30,Name=“Jacob”},
新的KeyValueClass{Age=23,Name=“Vladimir”},
};
var myDistinctList=myList.GroupBy(x=>new{x.Age,x.Name})
.Select(c=>c.First()).ToList();
}

只需使用ISet即可避免列表的开销和性能低下:

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);
}
公共类人员:IEquatable
{
公共整数{get;私有集;}
公共字符串名称{get;private set;}
公共布尔覆盖等于(其他人){
返回other.Age==Age&&other.Name.Equals(Name);
}
公共覆盖int GetHashCode(){
返回年龄。GetHashCode()^Name.GetHashCode();
}
}
私有IEnumerable MakeUniqueList(IEnumerable输入){
返回新的HashSet(输入);
}
为了实际删除,在性能方面会非常慢(但会节省内存使用),请使用List.remove(T)

您可以使用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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
List myList=新列表
{
新的KeyValueClass{Age=21,Name=“Carl”},
新的KeyValueClass{Age=23,Name=“Vladimir”},
新的KeyValueClass{Age=25,Name=“Bob”},
新的KeyValueClass{Age=21,Name=“Olivia”},
新的KeyValueClass{Age=21,Name=“Carl”},
新的KeyValueClass{Age=30,Name=“Jacob”},
新的KeyValueClass{Age=23,Name=“Vladimir”},
};
var myDistincList=myList.Distinct(新的KeyValueEqualityComparer());
foreach(myDistincList中的var项){Console.WriteLine(“Age:{0},Name:{1}”,item.Age,item.Name);}
Console.ReadKey();
}
}
公共类KeyValueClass
{
公共整数{get;set;}
公共字符串名称{get;set;}
}
类KeyValueEqualityComparer:IEqualityComparer
{
公共布尔等于(KeyValueClass x,KeyValueClass y)
{
如果(x==null | | y==null)返回false;
如果(x.Age==y.Age&&x.Name.Equals(y.Name))返回true;
返回false;
}
public int GetHashCode(KeyValueClass obj)
{
return(obj.Age+obj.Name).GetHashCode()+387;
}
}

可能的重复一个可能的解决方案,对列表进行排序,然后任何重复都将是连续的。此问题的答案如下: