web-dev-qa-db-ja.com

リスト<>から重複した値をラムダで削除する最も速い方法

リストから重複した値を削除する最も速い方法は何ですか。 List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };と仮定すると、ラムダを使用して重複を削除し、返されるのは興味深いです:{1, 2, 3, 4, 5}。あなたの提案は何ですか?

68
Saeid

newリストを取得する最も簡単な方法は次のとおりです。

List<long> unique = longs.Distinct().ToList();

それで十分ですか、またはexistingリストを変更する必要がありますか?後者は非常に長い時間がかかります。

Distinct() は元の順序を維持するためにguaranteedではありませんが、現在の実装では- naturalの実装。詳細については、私の Distinct()に関するEdulinqブログ投稿 を参照してください。

List<long>である必要がない場合は、次のように保持できます。

IEnumerable<long> unique = longs.Distinct();

この時点で、uniqueを繰り返し処理するたびに重複排除が行われます。それが良いかどうかは、要件によって異なります。

123
Jon Skeet

この拡張メソッドは、より複雑な型を含む列挙可能オブジェクトに使用できます。

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)));
}
78
Jon Rea

Distinct()メソッドがあります。動作するはずです。

List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
7
Pongsathon.keng

新しいリストを作成するのではなく、元のリストに固執したい場合は、Distinct()拡張メソッドが内部で行うことと同様のことができます。つまり、HashSetを使用して一意性を確認します。

HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));

Listクラスは、この便利なRemoveAll(predicate)メソッドを提供し、述部で指定された条件を満たさないすべての要素をドロップします。述語は、リストの要素タイプのパラメータを取り、ブール値を返すデリゲートです。 HashSetのAdd()メソッドは、セットにまだアイテムが含まれていない場合にのみtrueを返します。したがって、セットに追加できないアイテムをリストから削除すると、すべての重複が効果的に削除されます。

6
Wormbo
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
2
Nikhil Agrawal

シンプルで直感的な実装

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;
}
1
Moctar Haiz