[C#] C # 배열에서 중복을 어떻게 제거합니까?

string[]함수 호출에서 반환되는 C # 의 배열 로 작업하고 있습니다. Generic컬렉션에 캐스팅 할 수 는 있었지만 temp 배열을 사용하여 더 좋은 방법이 있는지 궁금했습니다.

C # 배열에서 중복을 제거하는 가장 좋은 방법은 무엇입니까?



답변

LINQ 쿼리를 사용하여 다음을 수행 할 수 있습니다.

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();


답변

HashSet <string> 접근 방식 은 다음과 같습니다 .

public static string[] RemoveDuplicates(string[] s)
{
    HashSet<string> set = new HashSet<string>(s);
    string[] result = new string[set.Count];
    set.CopyTo(result);
    return result;
}

불행히도이 솔루션에는 해당 버전까지 HashSet이 추가되지 않았으므로 .NET Framework 3.5 이상이 필요합니다. LINQ의 기능인 array.Distinct ()를 사용할 수도 있습니다 .


답변

다음 테스트 및 작동 코드는 배열에서 중복을 제거합니다. System.Collections 네임 스페이스를 포함해야합니다.

string[] sArray = {"a", "b", "b", "c", "c", "d", "e", "f", "f"};
var sList = new ArrayList();

for (int i = 0; i < sArray.Length; i++) {
    if (sList.Contains(sArray[i]) == false) {
        sList.Add(sArray[i]);
    }
}

var sNew = sList.ToArray();

for (int i = 0; i < sNew.Length; i++) {
    Console.Write(sNew[i]);
}

원한다면 이것을 함수로 묶을 수 있습니다.


답변

정렬해야 할 경우 중복을 제거하는 정렬을 구현할 수 있습니다.

그런 다음 하나의 돌로 두 마리의 새를 죽입니다.


답변

이것은 솔루션을 얼마나 엔지니어링하고 싶은가에 달려 있습니다. 배열이 그렇게 크지 않고 목록 정렬에 신경 쓰지 않는다면 다음과 비슷한 것을 시도해보십시오.

    public string[] RemoveDuplicates(string[] myList) {
        System.Collections.ArrayList newList = new System.Collections.ArrayList();

        foreach (string str in myList)
            if (!newList.Contains(str))
                newList.Add(str);
        return (string[])newList.ToArray(typeof(string));
    }


답변

– 매번 인터뷰 질문 입니다. 이제 코딩을 완료했습니다.

static void Main(string[] args)
{
            int[] array = new int[] { 4, 8, 4, 1, 1, 4, 8 };
            int numDups = 0, prevIndex = 0;

            for (int i = 0; i < array.Length; i++)
            {
                bool foundDup = false;
                for (int j = 0; j < i; j++)
                {
                    if (array[i] == array[j])
                    {
                        foundDup = true;
                        numDups++; // Increment means Count for Duplicate found in array.
                        break;
                    }
                }

                if (foundDup == false)
                {
                    array[prevIndex] = array[i];
                    prevIndex++;
                }
            }

            // Just Duplicate records replce by zero.
            for (int k = 1; k <= numDups; k++)
            {
                array[array.Length - k] = '\0';
            }


            Console.WriteLine("Console program for Remove duplicates from array.");
            Console.Read();
        }


답변

List<String> myStringList = new List<string>();
foreach (string s in myStringArray)
{
    if (!myStringList.Contains(s))
    {
        myStringList.Add(s);
    }
}

이것은 O (n ^ 2) 이며, 콤보에 채워질 짧은 목록에는 중요하지 않지만 큰 컬렉션에서 빠르게 문제가 될 수 있습니다.