私は次のような基準を渡すことができるDistinct拡張メソッドを作成しています。どのようにFunc <T,TResult>は機能しますか?
persons.Distinct(p => p.Name);
私は、Webからのコードを得たが、私はFunc<T, TResult>
の目的を理解することに苦労しています。また、私がp => p.Name
と言うときは、String
Name
を送っていますか、それとも完全なPerson
オブジェクトを送っていますか?ここでは新しい個別の方法は次のとおりです。
public static class ExtensionMethods
{
public static IEnumerable<T> Distinct<T>(
this IEnumerable<T> list, Func<T,object> checker)
{
return list.Distinct(new GenericComparer<T>(checker));
}
}
public class GenericComparer<T> : IEqualityComparer<T>
{
private Func<T, object> _checker;
public GenericComparer(Func<T,object> checker)
{
_checker = checker;
}
public bool Equals(T x, T y)
{
return _checker(x).Equals(_checker(y));
}
public int GetHashCode(T obj)
{
return _checker(obj).GetHashCode();
}
}
そして、ここでは、使用ある:
static void Main(string[] args)
{
var persons = new List<Person>()
{
new Person() { Id = 1, Name = "Mary"},
new Person() {Id = 2, Name="John"},
new Person() { Id = 3, Name = "Mary"}
};
var uniquePersons = persons.Distinct(p => p.Name);
foreach(var person in uniquePersons)
{
Console.WriteLine(person.Name);
}
}
+1 "しかし、あなたの場合、他の要素に同じ名前がない場合、要素は区別されます。ソース内の複数の項目の名前が同じ場合、結果の最初の項目だけが結果に表示されます。 "また、Distict()メソッドのオーバーロードはセレクタを必要としません - あなた自身で記述しましたか? –
OP質問はDistinctエクステンションがどのように定義されているかを示しています... – ShuggyCoUk
はい、私はインターネットのDistinct拡張メソッドを持っています!私はそれを自分で書いていませんでした! –