Najszybszy sposób na usunięcie zduplikowanej wartości z listy < > przez lambda
Jaki jest najszybszy sposób na usunięcie zduplikowanych wartości z listy.
Zakładam List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
więc jestem ciekawy w użyciu lambda do usunięcia duplikatu i zwracam: {1, 2, 3, 4, 5}
. Co proponujesz?
7 answers
Najprostszym sposobem na uzyskanie nowej listy byłoby:
List<long> unique = longs.Distinct().ToList();
Czy to ci wystarczy, czy musisz zmutować istniejącą listę? Ten ostatni jest znacznie bardziej długowieczny.
Zauważ, że Distinct()
nie jest zagwarantowane zachowanie pierwotnego porządku, ale w obecnej implementacji będzie-i to jest najbardziej naturalna implementacja. Zobacz mój wpis na blogu Edulinq o Distinct()
więcej informacji.
Jeśli nie musisz to być List<long>
, możesz to po prostu zachować jako:
IEnumerable<long> unique = longs.Distinct();
W tym momencie będzie to przejść przez de-duping za każdym razem iteracji nad unique
choć. To, czy to jest dobre, czy nie, zależy od twoich wymagań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 09:51:46
Możesz użyć tej metody rozszerzenia dla enumerabli zawierających bardziej złożone typy:
IEnumerable<Foo> distinctList = sourceList.DistinctBy(x => x.FooName);
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector)
{
var knownKeys = new HashSet<TKey>();
return source.Where(element => knownKeys.Add(keySelector(element)));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-08 12:25:56
Istnieje metoda Distinct (). powinno zadziałać.
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 09:19:37
Jeśli chcesz trzymać się oryginalnej listy zamiast tworzyć nową, możesz zrobić coś podobnego do tego, co wewnętrznie robi metoda rozszerzenia Distinct()
, tzn. użyć HashSet, aby sprawdzić unikalność:
HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));
Klasa List dostarcza wygodną metodę RemoveAll(predicate)
, która odrzuca wszystkie elementy niespełniające warunku określonego przez predykat. Predykat jest delegatem pobierającym parametr typu elementu listy i zwracającym wartość bool. Metoda Add()
HashSet zwraca true tylko jeżeli zestaw nie zawiera jeszcze elementu. Tak więc usuwając wszystkie elementy z listy, których nie można dodać do zestawu, skutecznie usuwasz wszystkie duplikaty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-27 08:55:46
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 09:14:19
Prosta, intuicyjna implementacja
public static List<PointF> RemoveDuplicates(List<PointF> listPoints)
{
List<PointF> result = new List<PointF>();
for (int i = 0; i < listPoints.Count; i++)
{
if (!result.Contains(listPoints[i]))
result.Add(listPoints[i]);
}
return result;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 05:58:16
In-place:
public static void DistinctValues<T>(List<T> list)
{
list.Sort();
int src = 0;
int dst = 0;
while (src < list.Count)
{
var val = list[src];
list[dst] = val;
++dst;
while (++src < list.Count && list[src].Equals(val)) ;
}
if (dst < list.Count)
{
list.RemoveRange(dst, list.Count - dst);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 14:53:22