문제

C#에는 정수 목록이 있습니다. 중복을 제거하고 싶습니다. C ++에서는 STD :: Sort 및 STD :: 고유 한 알고리즘을 통해 고유 목록을 얻는 매우 효율적인 방법을 통해 실행합니다.

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;
    }
도움이 되었습니까?

해결책

어떤 버전의 .NET을 사용하고 있습니까?

.NET 3.5에서 별개의() 확장 방법 및 그런 다음 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)

다른 팁

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

2.0에 해당합니다

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

.NET 2.0에서도 동일하게 얻을 수 있습니다. Linqbridge. 이것은 c# 3.0 (.NET 2.0에서도)에서 사용하기가 더 쉽지만 C# 2.0 및 .NET 2.0에서는 사용할 수 있어야합니다.

물론, 궁극적으로 이들은 이전에 게시 한 코드의 사전 랩핑 버전 (반복자 블록과 같은 주제를 제공)이므로 해당 코드를 유틸리티 클래스로 푸시하고 (Re) 사용할 수 있습니다.

아아 나는 함께 일할 .NET 2.0 만 있습니다

반쯤 관련된 메모에서 C#은 다음과 같습니다. System.Array.SORT 컬렉션을 사용하지 않고 실제 배열을 정렬하는 데 사용할 수있는 정적 메소드.

나는 당신의 컬렉션이 얼마나 큰지 모르겠지만, 당신이 수천 개의 정수를 다루지 않으면 이것은 충분할 것입니다.

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;
        }
    }
}
  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;
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top