LINQ Distinct () na określonej właściwości
Bawię się z LINQ, aby się tego dowiedzieć, ale nie mogę dowiedzieć się, jak używać
Distinct, gdy nie mam prostej listy (prosta lista liczb całkowitych jest dość łatwa zrobić, bez wątpienia). Co mogę zrobić, jeśli chcę skorzystać
Distinct
https://msdn.microsoft.com/lib ... .aspx
na liście obiektów wg
jeden
lub
kilka
właściwości obiektu?
Przykład: jeśli obiekt ma wartość
Person, to z właściwością
Id. Jak mogę pozyskać wszystkie osoby i użyć na nich
Distinctz właściwością
Idobiektu?
Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"
Jak mogę uzyskać tylko
Person1i
Person3? Czy to możliwe?
Jeśli nie jest to możliwe z LINQ, jaki byłby najlepszy sposób na utworzenie listy
Personw zależności od niektórych jej właściwości w .NET 3.5?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
20 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
jeden
lub
kilka
nieruchomości?
To takie proste! Chcesz je pogrupować i wybrać zwycięzcę z grupy.
Jeśli chcesz zdefiniować grupy dla wielu usług, oto jak to zrobić:
Anonimowy użytkownik
Potwierdzenie od:
EDIT
: teraz to część
MoreLINQ
https://github.com/morelinq/MoreLINQ
.
To, czego chcesz, to efektywne „rozróżnianie”. Nie wierzę, że jest to część LINQ w obecnej postaci, chociaż dość łatwo jest napisać:
Dlatego, aby znaleźć różne wartości przy użyciu tylko właściwości , możesz użyć:
Aby użyć wielu właściwości, możesz użyć typów anonimowych, które odpowiednio implementują równość:
Nie przetestowane, ale powinno działać (a teraz przynajmniej się kompiluje).
Zakłada jednak domyślny komparator dla kluczy - jeśli chcesz przekazać komparator równości, po prostu przekaż go do konstruktora .
Anonimowy użytkownik
Potwierdzenie od:
pomaga filtrować rekordy (być może bardziej złożone), podczas gdy i robią różne rzeczy.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
do odpowiedzi Jona Skeeta
https://coderoad.ru/489258/
.
Testowany na .NET 4.5, powinien działać na dowolnej wcześniejszej wersji LINQ.
Swoją drogą, sprawdź
najnowsza wersja DistinctBy.cs Jona Skeeta w Google Code
http://code.google.com/p/morel ... By.cs
.
Anonimowy użytkownik
Potwierdzenie od:
Oto artykuł:
Rozszerzenie LINQ - określanie właściwości w oddzielnej funkcji
http://www.singingeels.com/Art ... .aspx
Anonimowy użytkownik
Potwierdzenie od:
Następnie metoda rozszerzenia:
Wreszcie przeznaczenie:
Zaletą, jaką znalazłem stosując to podejście, jest to, że klasa jest ponownie wykorzystywana dla innych metod, które akceptują . (Aha, i zostawiam rzeczy dla początkowej implementacji LINQ ...)
Anonimowy użytkownik
Potwierdzenie od:
przy użyciu Microsoft.Ajax.Utilities;
a następnie użyj tego w ten sposób:
gdzie „Indeks” to właściwość, dla której chcę, aby dane były inne.
Anonimowy użytkownik
Potwierdzenie od:
Oto jak tego używasz:
Anonimowy użytkownik
Potwierdzenie od:
Tak więc przypadek użycia wyglądał mniej więcej tak:
Samo API And wygląda mniej więcej tak:
Więcej informacji można znaleźć na naszej stronie internetowej:
IEqualityComparer w LINQ
http://www.nesterovsky-bros.co ... .aspx
.
Anonimowy użytkownik
Potwierdzenie od:
To znaczy „wybierz wszystkie osoby, w przypadku których nie ma innej osoby na liście o tym samym identyfikatorze”.
Pamiętaj, że w twoim przykładzie będzie to po prostu wybór osoby 3. Nie jestem pewien, jak powiedzieć, czego chcesz od dwóch poprzednich.
Anonimowy użytkownik
Potwierdzenie od:
Zaczynasz od utworzenia ogólnej niestandardowej klasy porównania równości, która używa składni lambda do wykonania niestandardowego porównania między dwoma wystąpieniami klasy ogólnej:
Następnie w swoim głównym kodzie używasz go w następujący sposób:
Voila! :)
Powyższe zakłada, że:
Jeśli kolekcja może zawierać zera, po prostu przepisz wyrażenia lambda, aby sprawdzić wartość null, na przykład:
EDIT
To podejście jest podobne do tego zawartego w odpowiedzi Vladimira Nesterovsky'ego, ale prostsze.
Jest również podobna do odpowiedzi Joela, ale pozwala na złożoną logikę porównania obejmującą wiele właściwości.
Jeśli jednak Twoje obiekty mogą różnić się tylko przez , inny użytkownik podał poprawną odpowiedź, że jedyne, co musisz zrobić, to zastąpić domyślne implementacje i w klasie , a następnie po prostu użyj gotowej metody Linq, aby odfiltrować wszelkie duplikaty.
Anonimowy użytkownik
Potwierdzenie od:
ten kod zwraca różne wartości. Jednak chcę zwrócić kolekcję o silnym typie, w przeciwieństwie do typu anonimowego
https://coderoad.ru/7336275/), ale jeśli chcesz mieć coś wspólnego w całym kodzie, rozwiązania przedstawione w tym artykule są świetne.
Anonimowy użytkownik
Potwierdzenie od:
Equals(object obj)
i
GetHashCode()
:
a potem po prostu zadzwoń:
List<Person> distinctList = new[] { person1, person2, person3 }.Distinct().ToList();
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: