Programing

람다로 목록에서 중복 값을 제거하는 가장 빠른 방법 <>

crosscheck 2020. 11. 3. 07:39
반응형

람다로 목록에서 중복 값을 제거하는 가장 빠른 방법 <>


목록에서 중복 값을 제거하는 가장 빠른 방법은 무엇입니까? List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };그래서 나는 람다를 사용하여 중복을 제거하고 반환하는 데 흥미 롭다고 가정합니다 {1, 2, 3, 4, 5}. 당신의 제안은 무엇입니까?


목록 을 얻는 가장 쉬운 방법 은 다음과 같습니다.

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

이 정도면 충분합니까, 아니면 기존 목록 을 변경해야 합니까? 후자는 훨씬 더 오래 걸립니다.

원래 순서를 유지 한다고 보장Distinct()는 없지만 현재 구현에서는 그대로 유지됩니다 . 이것이 가장 자연스러운 구현입니다. 자세한 내용은 Edulinq 블로그 게시물 을 참조하십시오.Distinct()

필요하지 않은 경우 다음 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)조건자가 지정한 조건을 충족하지 않는 모든 요소를 ​​삭제 하는이 편리한 메서드를 제공합니다 . 술어는 목록의 요소 유형의 매개 변수를 취하고 bool 값을 리턴하는 대리자입니다. 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;
}

현재 위치 :

    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);
        }
    }

참고 URL : https://stackoverflow.com/questions/10632776/fastest-way-to-remove-duplicate-value-from-a-list-by-lambda

반응형