2015-09-02 29 views
6

ja jechałem za pomocą metody GroupBy w LINQ:GroupBy i IEqualityComparer <TKey> comparer

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

rozumiem jak używać GroupBy i co to zwraca. Chcę zrozumieć znaczenie IEqualityComparer<TKey> comparer i do czego jest on faktycznie używany w GroupBy.

+0

'return x.Length - y.Length> = 0;' Dlaczego używasz tego jako sposobu mierzenia równości? –

+0

Po prostu chciałem go uruchomić, aby zobaczyć, jak to działa. –

Odpowiedz

10

Przedmiotem IEqualityComparer<TKey> zostaną wykorzystane do przeprowadzenia kontroli dwuetapowy aby sprawdzić, czy instancja TKey jest „równy” do tonacji istniejącej grupy, a zatem powinno być w tej grupie:

  1. sprawdza kod skrótu elementu (przy użyciu GetHashCode) w odniesieniu do kodu skrótu istniejących kluczy. Jeśli nie jest równa żadnej z tych wartości, jest dodawana do nowej grupy
  2. Jeśli zostanie znaleziony pasujący kod skrótu, to następnie sprawdza równość (używając Equals). Jeśli element jest "równy" kluczowi grupy, element zostanie dodany do tej grupy.

Jeśli nie nie dostarczyć comparer (albo przekazując null lub przy użyciu jednego z przeciążeniami, że nie ma tego parametru), przy czym „deafult” comparer jest używany, który wykorzystuje samej klasy TKey jeśli to implementuje IEquatable lub dowolne odpowiednie przesłonięcia Equals i GetHashCode.

Więc oznacza to kilka kluczowych relacji między Equals i GetHashCode:

  • Jeśli dwa elementy są równe, koniecznością mają ten sam kod skrótu.
  • Przeciwnie, nie jest prawdą - dwa elementy, które mają ten sam kod skrótu, nie mają wartości równej , mają.
+0

Ładnie wyjaśniono. Dzięki! –

-1

Dostarczyłeś bezsensownego porównywalnika równości, więc twoje wyniki będą bezsensowne. Twój kod skrótu opiera się na odwołaniu do samego porównywalnika, który nie ma nic wspólnego z niczym w twojej metodzie Equals, i w twojej metodzie Equals mówisz, że dwa obiekty są równe, jeśli pierwszy obiekt jest tak długi lub dłuższy niż drugi ciąg. To po prostu nie ma sensu, narusza nawet podstawowe cechy równości w tym sensie, że kolejność parametrów powinna być nieistotna.

+0

Nie jestem pewien, jak go używać, więc napisałem to tak szybko, aby zobaczyć, jak to zadziała –

+0

@VishalAnand Możesz przeczytać dokumentację, aby zobaczyć, jak to działa. Kiedy używasz go niepoprawnie, nie robi nic sensownego, jak sam widziałeś. Jeśli nie masz pojęcia, co naprawdę chcesz zrobić, nie ma sposobu, abyśmy ci pomogli. – Servy

+0

Dzięki za odpowiedź. Zmieniłem to pytanie. Może teraz będzie miało więcej sensu. Masz rację, może wdrożenie nie miało sensu. Po prostu bawię się wokół API. Podobnie jak w przypadku użycia polecenia OrderBy lub OrderByDescending lub ThenBy, porównywarka IEqualityComparer służy do porównywania w celu zamówienia. Nie jestem w stanie zrozumieć scenariuszy, w których zrobiłbym coś takiego w GroupBy. Dlaczego muszę porównać w grupie przez. Jeśli możesz wyjaśnić na przykładzie, który mi pomoże. –

Powiązane problemy