2008-11-05 7 views
4

C의 정수 목록이 있습니다. #. 중복을 제거하고 싶습니다. C++에서는 고유 한 목록을 얻는 매우 효율적인 방법으로 std :: sort 및 std :: unique 알고리즘을 통해 실행할 것입니다.std :: sort 및 std :: unique에 해당하는 C#

C#에서 같은 작업을 수행하는 가장 좋은 방법은 무엇입니까? 즉, 다음 코드를 수행하는보다 우아한 방법을 찾고 있습니다.

private static int[] unique(int[] ids) 
    { 
     IDictionary<int, object> d = new Dictionary<int, object>(); 
     foreach(int i in ids) 
      d[i] = null; 

     int[] results = new int[d.Count]; 
     int j = 0; 
     foreach(int id in d.Keys) 
      results[j++] = id; 

     return results; 
    } 

답변

8

사용중인 .NET 버전은 무엇입니까?

. NET 3.5에서는 Distinct() 확장 메서드를 호출하는 것처럼 간단하고을 호출하면됩니다. 실제로 배열이 다시 필요할 경우 ToArray()이 필요합니다. 예를 들어

:

int[] x = new[] { 1, 4, 23, 4, 1 }; 
int[] distinct = x.Distinct().ToArray(); 
// distinct is now { 1, 4, 23 } (but not necessarily in that order) 
0

아아 나는 단지 심지어 .NET 2.0

1

작업을 .NET 2.0을 가지고, 당신은 LINQBridge와 같은를 얻을 수 있습니다. 이것은 C# 3.0 (.NET 2.0 포함)에서도 사용하기 쉽지만 C# 2.0 및 .NET 2.0에서는 사용할 수 있어야합니다. x.Distinct()보다는 Enumerable.Distinct (x)를 사용하면됩니다.

물론 이것은 궁극적으로 이전에 게시 한 코드의 미리 래핑 된 버전이므로 반복기 블록과 같은 코드를 유틸리티 클래스에 넣고 다시 사용할 수 있습니다. 거기에서.

3

당신이 "매우 효율적"등의 STL 방법을 고려, 그래서 사용 다음과 같은 경우 :

 var vals = new List<int> { 1, 2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 2, 3 }; 
     vals.Sort(); 
     var uniques = new HashSet<int>(vals); 

반 방법 관련 주에 해당하는

List<int> vals = new List<int>(); 
vals.Add(1); 
vals.Add(2); 
vals.Add(3); 
vals.Add(2); 
... 
vals.Sort(); 
List<int> uniques = new List<int>(); 
vals.ForEach(delegate(int v) { 
if (!uniques.Contains(v)) uniques.Add(v); 
}); 
+1

내가로부터 많은 혜택이 있다고 생각하지 않습니다 정렬 - 내가 이해하는 한, HashSet은 특별한 순서가 아닙니다. 게다가 .NET 3.5 (OP는 .NET 2.0 만 지원) –

0

2.0은 C 번호는 System.Array.Sort 정적 방법이있다 컬렉션을 사용하지 않고 실제 배열을 정렬하는 데 사용할 수 있습니다.

0

나는 컬렉션이 얼마나 큰 모르겠지만, 당신은 정수의 수천을 처리하지 않으면이 충분 있습니다

public IEnumerable<int> unique(int[] ids) 
{ 
    List<int> l = new List<int>(); 
    foreach (int id in ids) 
    { 
     if (!l.Contains(id)) 
     { 
      l.Add(id); 
      yield return id; 
     } 
    } 
} 
0
private static List<T> GetUnique<T>(List<T> list) where T : IEquatable<T> 
    { 
    list.Sort(); 
    int count = list.Count; 
    List<T> unique = new List<T>(count); 
    T last = default(T); 
    for (int i = 0; i < count; i++) 
    { 
     T val = list[i]; 
     if (i != 0 && last.Equals(val)) continue; 
     last = val; 
     unique.Add(val); 
    } 
    return unique; 
    }