Как удалить объекты с комбинацией дубликатов двух свойств из List с помощью linq? - PullRequest
0 голосов
/ 05 января 2019

Тот же вопрос, что и , этот , но мне нужно удалить объекты с комбинацией дубликатов двух свойств из списка.

Существует множество объектов, объекты имеют возраст и имя:

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

Список вывода должен содержать:

21 Carl
23 Vladimir
25 Bob
21 Olivia
30 Jacob

Как мне это удалить?

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Просто используйте 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

0 голосов
/ 06 января 2019

Вы можете использовать Distinct () из пространства имен Linq и 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;
    }
}
0 голосов
/ 05 января 2019

Попробуйте это:

  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();
    }
...