Jeder haben eine schnelle Methode für de-Duplizierung eine generische Liste in C#?
Dieser Ansatz kann nur für Listen mit einfachen Werten verwendet werden.
Jeder haben eine schnelle Methode für de-Duplizierung eine generische Liste in C#?
Nein, es funktioniert mit Listen, die Objekte beliebigen Typs enthalten. Aber Sie müssen den Standardkomparator für Ihren Typ überschreiben. Etwa so: public override bool Equals(object obj){...}
Es ist immer eine gute Idee, ToString() und GetHashCode() in Ihren Klassen zu überschreiben, damit diese Dinge funktionieren.
Vielleicht sollten Sie die Verwendung eines HashSet .
Über den MSDN-Link:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> evenNumbers = new HashSet<int>();
HashSet<int> oddNumbers = new HashSet<int>();
for (int i = 0; i < 5; i++)
{
// Populate numbers with just even numbers.
evenNumbers.Add(i * 2);
// Populate oddNumbers with just odd numbers.
oddNumbers.Add((i * 2) + 1);
}
Console.Write("evenNumbers contains {0} elements: ", evenNumbers.Count);
DisplaySet(evenNumbers);
Console.Write("oddNumbers contains {0} elements: ", oddNumbers.Count);
DisplaySet(oddNumbers);
// Create a new HashSet populated with even numbers.
HashSet<int> numbers = new HashSet<int>(evenNumbers);
Console.WriteLine("numbers UnionWith oddNumbers...");
numbers.UnionWith(oddNumbers);
Console.Write("numbers contains {0} elements: ", numbers.Count);
DisplaySet(numbers);
}
private static void DisplaySet(HashSet<int> set)
{
Console.Write("{");
foreach (int i in set)
{
Console.Write(" {0}", i);
}
Console.WriteLine(" }");
}
}
/* This example produces output similar to the following:
* evenNumbers contains 5 elements: { 0 2 4 6 8 }
* oddNumbers contains 5 elements: { 1 3 5 7 9 }
* numbers UnionWith oddNumbers...
* numbers contains 10 elements: { 0 2 4 6 8 1 3 5 7 9 }
*/
Seine unglaubliche Geschwindigkeit... 100.000 Strings mit List brauchen 400s und 8MB ram, meine eigene Lösung braucht 2.5s und 28MB, hashset braucht 0.1s!!! und 11MB ram
HashSet
keinen Index hat Daher ist es nicht immer möglich, sie zu verwenden. Ich muss einmal eine große Liste ohne Duplikate erstellen und sie dann für ListView
im virtuellen Modus. Es war superschnell, eine HashSet<>
und wandeln Sie es dann in eine List<>
(also ListView
kann auf Elemente nach Index zugreifen). List<>.Contains()
zu langsam ist.
Es wäre hilfreich, wenn es ein Beispiel für die Verwendung eines Hashsets in diesem speziellen Kontext gäbe.
@darkgaze dies erstellt einfach eine weitere Liste mit nur eindeutigen Einträgen. So werden alle Duplikate entfernt und es bleibt eine Liste übrig, in der jede Position ein anderes Objekt enthält.
Ich verwende gerne diesen Befehl:
List<Store> myStoreList = Service.GetStoreListbyProvince(provinceId)
.GroupBy(s => s.City)
.Select(grp => grp.FirstOrDefault())
.OrderBy(s => s.City)
.ToList();
Ich habe diese Felder in meiner Liste: Id, StoreName, Stadt, PostalCode Ich wollte eine Liste von Städten in einer Dropdown-Liste anzeigen, die doppelte Werte enthält. Lösung: Nach Stadt gruppieren und die erste Stadt für die Liste auswählen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
5 Stimmen
Ist Ihnen die Reihenfolge der Elemente im Ergebnis wichtig? Dies wird einige Lösungen ausschließen.
3 Stimmen
Eine Ein-Zeilen-Lösung:
ICollection<MyClass> withoutDuplicates = new HashSet<MyClass>(inputList);
0 Stimmen
Wo würde diese Methode angewendet werden?