3

人のリストから明確なリストを取得したい。

List<Person> plst = cl.PersonList;

を介してこれを行う方法LINQ。結果を保存したいList<Person>

4

3 に答える 3

5

Distinct()明確な値が得られますが、オーバーライドしない限りEquals、明確な参照GetHashCode()を取得するだけです。たとえば、名前が等しい場合に2つのオブジェクトを等しくしたい場合は、 /をオーバーライドしてそれを示す必要があります。(理想的には、オーバーライドするだけでなく、実装することもできます。)PersonEqualsGetHashCodeIEquatable<Person>Equals(object)

ToList()次に、呼び出して結果を次のように戻す必要がありますList<Person>

var distinct = plst.Distinct().ToList();

特定の特性によって明確な人々を獲得したいが、それが「自然な」平等の適切な候補ではない場合は、次のGroupByように使用する必要があります。

var people = plst.GroupBy(p => p.Name)
                 .Select(g => g.First())
                 .ToList();

または、 MoreLINQDistinctByのメソッドを使用します。

var people = plst.DistinctBy(p => p.Name).ToList();
于 2012-11-18T08:43:57.603 に答える
1

Distinctメソッドを使用できます。IEquatableを実装し、equalsとハッシュコードをオーバーライドする必要があります。

public class Person : IEquatable<Person>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(Person other)
    {

        //Check whether the compared object is null. 
        if (Object.ReferenceEquals(other, null)) return false;

        //Check whether the compared object references the same data. 
        if (Object.ReferenceEquals(this, other)) return true;

        //Check whether the person' properties are equal. 
        return Code.Equals(other.Code) && Name.Equals(other.Name);
    }

    // If Equals() returns true for a pair of objects  
    // then GetHashCode() must return the same value for these objects. 

    public override int GetHashCode()
    {

        //Get hash code for the Name field if it is not null. 
        int hashPersonName = Name == null ? 0 : Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashPersonCode = Code.GetHashCode();

        //Calculate the hash code for the person. 
        return hashPersonName ^ hashPersonCode;
    }
}
var distinctPersons = plst.Distinct().ToList();
于 2012-11-18T08:42:45.497 に答える
1

Distinct拡張メソッドを使用すると、IEnumerableが返され、次の操作を実行できますToList()

List<Person> plst = cl.PersonList.Distinct().ToList();
于 2012-11-18T08:46:30.243 に答える