1

私は人のクラスを持っています:

Public Class Person
{
public string Name {get; set;}
public string Id {get; set;}
}

Public EqualityOnPerson : IEqualityComparer<Person>
{
public bool Equals(PersonData x, PersonData y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode();
    }

}

IDが重複している人物オブジェクトのリストがあります。

Person.Name = "ABC"
Person.Id = "123"

Person.Name = "CBA"
Person.Id = "123"

Person.Name = "DEF"
Person.Id = "456"

Person.Name = "GHI"
Person.Id = "789"

Person.Name = "JKL"
Person.Id = "789"

Person.Name = "MNO"
Person.Id = "789"

Person.Name = "PQR"
Person.Id = "101"

Person.Name = "STU"
Person.Id = "102"

別個のものを使用すると、

Person.Name = "CBA"
Person.Id = "123"

Person.Name = "DEF"
Person.Id = "456"

Person.Name = "GHI"
Person.Id = "789"

Person.Name = "PQR"
Person.Id = "101"

Person.Name = "STU"
Person.Id = "102"

どうすればこれを入手できますか

Person.Name = "DEF"
Person.Id = "456"

Person.Name = "PQR"
Person.Id = "101"

Person.Name = "STU"
Person.Id = "102"

複製されていない人物オブジェクトのみ。

よろしく。

4

2 に答える 2

2

平等比較器を使用して人々をグループ化し、次に1人だけのグループから人々を選択する必要があります。

var unduplicatedPersons = persons
    .GroupBy(p => p, new EqualityOnPerson())
    .Where(g => g.Count() == 1)
    .Select(g => g.Key);

必要に応じて(楽しみのために)わずかにパフォーマンスが向上する可能性のある専用の拡張方法を次に示します。

public IEnumerable<T> DistinctOnly<T>(this IEnumerable<T> source,
                                      IEqualityComparer<T> comparer)
{
    HashSet<T> all = new HashSet<T>(comparer);
    HashSet<T> distinct = new HashSet<T>(comparer);
    foreach (T t in source)
    {
        if (all.Add(t))
            distinct.Add(t);
        else
            distinct.Remove(t);
    }
    return distinct;
}
于 2013-02-28T10:13:37.000 に答える
0
var result = persons.Where(outer => 
     persons.Count(inner => inner.Id == outer.Id ) < 2)

このように、あなたは平等比較器を必要としません。

于 2013-02-28T10:21:42.887 に答える