Mam więc kolekcję przedmiotów. Dokładny typ nie jest ważny. Chcę z niego wyodrębnić wszystkie unikalne pary pary określonych właściwości, w ten sposób:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Więc moje pytanie brzmi: Will Distinct w tym przypadku użyje domyślnego obiektu równa się (co będzie dla mnie bezużyteczne, ponieważ każdy obiekt jest nowy) lub czy można mu powiedzieć, aby zrobił różne równa się (w tym przypadku równe wartości Alpha i Bravo => równe instancje)? Czy jest jakiś sposób na osiągnięcie tego wyniku, jeśli to nie wystarczy?
Odpowiedzi:
Przeczytaj doskonały post K. Scotta Allena tutaj:
I równość dla wszystkich ... Anonimowe typy
Krótka odpowiedź (cytuję):
Dlatego użycie metody Distinct () w zapytaniu zwracającym typy anonimowe jest całkowicie bezpieczne.
źródło
Przepraszam za pomieszane formatowanie wcześniej
źródło
object
iobject
. Jeśli obaobject
sąstring
, nadal zwraca zduplikowane wiersze. WypróbujFirstName
is typeofobject
i przypiszstring
tam to samo .Ciekawe, że działa w C #, ale nie w VB
Zwraca 26 liter:
Zwroty 52 ...
źródło
Key
słowo kluczowe do typu anonimowego,.Distinct()
będzie działać zgodnie z przeznaczeniem (npNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
.).new {A = b}
toNew {Key .A = b}
. Właściwości niebędące kluczami w anonimowych klasach języka VB są modyfikowalne, dlatego są porównywane przez odniesienie. W języku C # wszystkie właściwości klas anonimowych są niezmienne.Przeprowadziłem mały test i stwierdziłem, że jeśli właściwości są typami wartości, wydaje się, że działa dobrze. Jeśli nie są to typy wartości, typ musi mieć własne implementacje Equals i GetHashCode, aby działał. Myślę, że struny będą działać.
źródło
Możesz stworzyć własną metodę Distinct Extension, która przyjmuje wyrażenie lambda. Oto przykład
Utwórz klasę, która pochodzi od interfejsu IEqualityComparer
Następnie utwórz metodę Distinct Extension
i możesz użyć tej metody, aby znaleźć różne elementy
źródło
object
iobject
. Jeśli obaobject
sąstring
, nadal zwraca zduplikowane wiersze. WypróbujFirstName
is typeofobject
i przypiszstring
tam to samo .Jeśli
Alpha
iBravo
oboje dziedziczą ze wspólnej klasy, będzie można podyktować kontrolę równości w klasie nadrzędnej, implementującIEquatable<T>
.Na przykład:
źródło
Hej, mam ten sam problem i znalazłem rozwiązanie. Musisz zaimplementować interfejs IEquatable lub po prostu zastąpić metody (Equals & GetHashCode). Ale to nie jest sztuczka, sztuczka pojawiająca się w metodzie GetHashCode. Nie powinieneś zwracać skrótu obiektu swojej klasy, ale powinieneś zwrócić hash właściwości, którą chcesz porównać.
Jak widzisz, otrzymałem klasę o nazwie osoba, która ma 3 właściwości (Imię, Wiek, IsEgyptian „Ponieważ jestem”). W GetHashCode zwróciłem hash właściwości Name, a nie obiektu Person.
Wypróbuj i zadziała ISA. Dziękuję, Modather Sadik
źródło
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Aby to działało w VB.NET, musisz podać
Key
słowo kluczowe przed każdą właściwością w typie anonimowym, tak jak poniżej:Zmagałem się z tym, myślałem, że VB.NET nie obsługuje tego typu funkcji, ale w rzeczywistości tak.
źródło