2015-09-02 21 views
6

tôi đang trải qua phương pháp groupby trong LINQ:groupby và IEqualityComparer <TKey> Comparer

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector, 
    IEqualityComparer<TKey> comparer 
) 

Tôi hiểu làm thế nào để sử dụng groupby và những gì nó trả về. Tôi muốn hiểu ý nghĩa của IEqualityComparer<TKey> comparer và nó thực sự được sử dụng trong GroupBy.

+0

'return x.Length - y.Length> = 0;' Tại sao bạn sử dụng điều này như một cách để đo lường bình đẳng? –

+0

Tôi chỉ muốn chạy nó để xem nó hoạt động như thế nào. –

Trả lời

10

Đối tượng IEqualityComparer<TKey> sẽ được sử dụng để thực hiện một kiểm tra hai bước để xem nếu một trường hợp TKey là "bình đẳng" để chìa khóa của nhóm tồn tại và do đó phải ở trong nhóm đó:

  1. Nó kiểm tra mã băm của mục (sử dụng GetHashCode) đối với mã băm của các khóa hiện có. Nếu nó không bằng bất kỳ giá trị nào, nó sẽ được thêm vào nhóm mới
  2. Nếu tìm thấy mã băm phù hợp, thì thì kiểm tra tính bình đẳng (sử dụng Equals). Nếu mục "bằng" khóa nhóm, mục sẽ được thêm vào nhóm đó.

Nếu bạn làm không cung cấp một Comparer (hoặc bằng cách đi qua null hoặc bằng một trong những quá tải mà không có tham số), các "deafult" Comparer được sử dụng, trong đó sử dụng các lớp TKey chính nó nếu nó thực hiện IEquatable hoặc bất kỳ phần ghi đè hiện hành nào của EqualsGetHashCode.

Vì vậy, điều này hàm ý một vài mối quan hệ quan trọng giữa EqualsGetHashCode:

  • Nếu hai mục đều bình đẳng, họ phải có mã hash giống nhau.
  • Điều ngược lại không đúng - hai mục có cùng mã băm không bằng nhau.
+0

Độc đáo giải thích. Cảm ơn! –

-1

Bạn đã cung cấp một trình so sánh bình đẳng vô nghĩa, do đó kết quả của bạn sẽ vô nghĩa. Mã băm của bạn dựa trên tham chiếu đến chính so sánh, không liên quan gì đến phương thức Equals và trong phương thức Equals bạn đang nói rằng hai đối tượng bằng nhau nếu đối tượng đầu tiên dài hoặc dài hơn chuỗi thứ hai. Điều này chỉ làm cho không có ý nghĩa, nó thậm chí vi phạm các tính chất cơ bản của bình đẳng trong đó thứ tự của các tham số nên không liên quan.

+0

Tôi không chắc chắn cách sử dụng nó, vì vậy tôi đã viết nó như thế để có kết quả nhanh chóng để xem nó hoạt động như thế nào –

+0

@VishalAnand Bạn có thể đọc tài liệu để biết cách hoạt động. Khi bạn sử dụng nó không chính xác, nó không làm bất cứ điều gì hợp lý, như bạn đã thấy cho chính mình. Nếu bạn không biết bạn thực sự muốn làm gì, không có cách nào để chúng tôi giúp bạn. – Servy

+0

Cảm ơn bạn đã trả lời. Tôi đã chỉnh sửa câu hỏi. Có lẽ bây giờ nó sẽ có ý nghĩa hơn. Bạn đúng, có lẽ việc thực hiện không có ý nghĩa. Tôi chỉ đang chơi xung quanh API. Giống như khi chúng tôi sử dụng OrderBy hoặc OrderByDescending hoặc ThenBy, IEqualityComparer , được sử dụng để so sánh để đặt hàng. Tôi không thể hiểu được tình huống mà tôi sẽ làm một điều như vậy trong GroupBy. Tại sao tôi cần phải so sánh trong nhóm theo. Nếu bạn có thể giải thích với một ví dụ sẽ giúp tôi. –

Các vấn đề liên quan