람다로 목록에서 중복 값을 제거하는 가장 빠른 방법 <>
목록에서 중복 값을 제거하는 가장 빠른 방법은 무엇입니까? 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);
}
}
'Programing' 카테고리의 다른 글
React.js에서 선언적과 명령 적의 차이점은 무엇입니까? (0) | 2020.11.03 |
---|---|
JavaScript에서 비트 연산자를 어디에서 사용합니까? (0) | 2020.11.03 |
javascript : 텍스트 선택 비활성화 (0) | 2020.11.03 |
/ bin / sh : apt-get : 찾을 수 없음 (0) | 2020.11.03 |
anaconda-graphviz-설치 후 가져올 수 없음 (0) | 2020.11.03 |