Tôi đang tạo một phương pháp mở rộng Riêng biệt, nơi tôi có thể vượt qua các tiêu chí như sau.Func <T,TResult> hoạt động như thế nào?
persons.Distinct(p => p.Name);
Tôi nhận được mã từ web nhưng tôi gặp khó khăn khi hiểu mục đích của Func<T, TResult>
. Ngoài ra, khi tôi nói p => p.Name
tôi có gửi String
Name
hoặc tôi đang gửi đối tượng hoàn chỉnh Person
? Dưới đây là phương pháp riêng biệt mới:
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();
}
}
Và đây là cách sử dụng:
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, nhưng "Trong trường hợp của bạn, phần tử là khác biệt nếu không có phần tử nào khác có cùng tên'. Nếu nhiều hơn một mục trong nguồn có cùng tên, chỉ có một mục đầu tiên trong số đó sẽ có mặt trong kết quả. "Ngoài ra, không có quá tải của phương thức' Distict() 'có bộ chọn - bạn có viết riêng của mình không? –
Câu hỏi OP cho thấy cách mở rộng khác biệt được xác định ... – ShuggyCoUk
Có, tôi có một phương pháp mở rộng khác biệt của internet! Tôi không viết nó bản thân mình –