リストから重複した値を削除する最も速い方法は何ですか。 List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
と仮定すると、ラムダを使用して重複を削除し、返されるのは興味深いです:{1, 2, 3, 4, 5}
。あなたの提案は何ですか?
newリストを取得する最も簡単な方法は次のとおりです。
List<long> unique = longs.Distinct().ToList();
それで十分ですか、またはexistingリストを変更する必要がありますか?後者は非常に長い時間がかかります。
Distinct()
は元の順序を維持するためにguaranteedではありませんが、現在の実装では- naturalの実装。詳細については、私の Distinct()
に関するEdulinqブログ投稿 を参照してください。
List<long>
である必要がない場合は、次のように保持できます。
IEnumerable<long> unique = longs.Distinct();
この時点で、unique
を繰り返し処理するたびに重複排除が行われます。それが良いかどうかは、要件によって異なります。
この拡張メソッドは、より複雑な型を含む列挙可能オブジェクトに使用できます。
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)));
}
Distinct()メソッドがあります。動作するはずです。
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
新しいリストを作成するのではなく、元のリストに固執したい場合は、Distinct()
拡張メソッドが内部で行うことと同様のことができます。つまり、HashSetを使用して一意性を確認します。
HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));
Listクラスは、この便利なRemoveAll(predicate)
メソッドを提供し、述部で指定された条件を満たさないすべての要素をドロップします。述語は、リストの要素タイプのパラメータを取り、ブール値を返すデリゲートです。 HashSetのAdd()
メソッドは、セットにまだアイテムが含まれていない場合にのみtrueを返します。したがって、セットに追加できないアイテムをリストから削除すると、すべての重複が効果的に削除されます。
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
シンプルで直感的な実装
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;
}