Rozumiem więc sposób usuwania duplikatów na liście, jeśli chodzi o ciągi i int, itp. Przy użyciu Distinct()
z Linq. Ale jak usunąć duplikaty na podstawie określonego atrybutu obiektu? Na przykład mam klasę TimeMetric
. Ta klasa TimeMetric
ma dwa atrybuty: MetricText
i MetricTime
. Mam listę TimeMetrics
o nazwie MetricList
. Chcę usunąć wszystkie duplikaty TimeMetric
z tym samym atrybutem MetricText
. Wartość TimeMetric
może być taka sama, ale jeśli jakikolwiek TimeMetric
ma taką samą wartość , musi być niepowielany.Usuwanie duplikatów obiektów z listy (C#)
18
A
Odpowiedz
21
Musisz użyć drugiego przeciążenia z Distinct
, które pobiera instancję IEqualityComparer<TimeMetric>
jako drugi parametr. Zdefiniuj porównywarka tak:
class MyComparer : IEqualityComparer<TimeMetric>
{
public bool Equals(TimeMetric x, TimeMetric y)
{
return x.MetricText.Equals(y.MetricText);
}
public int GetHashCode(TimeMetric obj)
{
return obj.MetricText.GetHashCode();
}
}
Ważna uwaga: Powyższy kod nie sprawdza w przypadku, gdy właściwość MetricText
jest null
(i brzmi to jak to może być, ponieważ jest to najprawdopodobniej string
). Powinieneś to zrobić i zwrócić 0
z GetHashCode
, jeśli MetricText
jest null
. Z drugiej strony, jeśli typ MetricText
jest typem wartości, nie trzeba wykonywać żadnych modyfikacji.
A potem:
var list = new List<TimeMetric> { ... };
var unique = list.Distinct(new MyComparer());
3
Można użyć Distinct overload z IEqualityComparer.
Twoja metoda equals do realizacji IEqualityComparer będzie wyglądać następująco:
bool Equals(TimeMetric x, TimeMetric y)
{
return x.MetricText.Equals(y.MetricText);
}
14
używać LINQ:
var list = list
.GroupBy(i => i.MetricText)
.Select(g => g.First())
.ToList();
Albo przechodzą w comparer który wykorzystuje właściwość:
public class mtCompare : IEqualityComparer<TimeMetric>
{
public bool Equals(TimeMetric x, TimeMetric y)
{
return Equals(x.MetricText, y.MetricText);
}
public int GetHashCode(TimeMetric obj)
{
return obj.MetricText.GetHashCode();
}
}
....
list.Distinct(new mtCompare());
Powiązane problemy
- 1. Usuwanie duplikatów odniesień z listy C#
- 2. Usuwanie duplikatów z tablicy obiektów niestandardowych Swift
- 3. Usuwanie duplikatów z listy ciągów w python
- 4. Usuwanie duplikatów z dołu listy ogólnej
- 5. Usuwanie duplikatów z listy ArrayList of ArrayLists
- 6. Usuwanie obiektów z duplikatem właściwości z listy
- 7. C# Usuwanie listy z listy
- 8. usuwanie duplikatów z tablicy w obiekcie c
- 9. VBA, usuwanie duplikatów z tablicy
- 10. Usuwanie kolejnych duplikatów wpisów
- 11. Usuwanie duplikatów z listy przy zachowaniu jej kolejności (Python)
- 12. Usuwanie duplikatów rekordów z tabeli
- 13. Usuwanie duplikatów z dużej tabeli
- 14. Usuwanie duplikatów elementów z tablicy
- 15. usuwanie duplikatów ze słownika
- 16. Usuwanie duplikatów wierszy (nie usuwaj wszystkich duplikatów)
- 17. usuwanie duplikatów w nsarray
- 18. Usuwanie duplikatów z nie sortowalnego wektora
- 19. NSMutableArray - usuwanie duplikatów
- 20. usuwanie duplikatów przy użyciu niestandardowych porównanie
- 21. Usuwanie duplikatów w języku Python
- 22. Podstawowy algorytm Hashtable - usuwanie duplikatów
- 23. usuwanie pozycji z listy weak_ptrs
- 24. Znajdowanie i usuwanie duplikatów na liście krotek w języku C#
- 25. Usuwanie wierszy z duplikatów w tablicy numpy
- 26. Usuwanie duplikatów z LEFT OUTER DOŁĄCZ
- 27. Usuwanie duplikatów migracji z repozytorium git
- 28. Usuwanie powtarzających się duplikatów liter
- 29. Usuwanie duplikatów wierszy w vi?
- 30. Usuwanie duplikatów rekordów w PostgreSQL
ten jest niepoprawny i działa tylko tak, jak powinien, jeśli 'MetricText' jest typu' string' (lub innego typu, który przesłania 'operator =='). Zamiast tego należy użyć 'Equals'. – Jon
Zakładam, że był to ciąg znaków, który nie był dobrym założeniem i zaktualizował odpowiedź. –