人のリストから明確なリストを取得したい。
List<Person> plst = cl.PersonList;
を介してこれを行う方法LINQ
。結果を保存したいList<Person>
Distinct()
明確な値が得られますが、オーバーライドしない限りEquals
、明確な参照GetHashCode()
を取得するだけです。たとえば、名前が等しい場合に2つのオブジェクトを等しくしたい場合は、 /をオーバーライドしてそれを示す必要があります。(理想的には、オーバーライドするだけでなく、実装することもできます。)Person
Equals
GetHashCode
IEquatable<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();
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();
Distinct拡張メソッドを使用すると、IEnumerableが返され、次の操作を実行できますToList()
。
List<Person> plst = cl.PersonList.Distinct().ToList();