program tip

C # 목록에서 중복 확인

radiobox 2020. 11. 29. 10:11
반응형

C # 목록에서 중복 확인


이 질문에 이미 답변이 있습니다.

요구 사항 : 정렬되지 않은 목록에서 중복이 있는지 확인합니다. 이것을 수행하는 일반적인 방법은 n 제곱 중첩 루프입니다. 나는 다른 사람들이 이것을 어떻게 해결하는지 궁금합니다. Linq에 우아하고 고성능의 방법이 있습니까? 람다 또는 비교자를 취하는 일반적인 것이 좋을 것입니다.


내가 뭔가를 놓친 것이 아니라면 .NET을 사용하여 간단한 것을 피할 수 있습니다 Distinct(). 당신이 생각 해낼 수있는 가장 복잡한 구현은 아니지만 중복이 제거되면 알려줄 것입니다.

var list = new List<string>();

// Fill the list

if(list.Count != list.Distinct().Count())
{
     // Duplicates exist
}

하는 방법에 에릭 화이트의 기사에 따르면 중복 사용 LINQ를 찾기 :

중복을 찾는 쉬운 방법은 식별자로 그룹화하는 쿼리를 작성한 다음 둘 이상의 구성원이있는 그룹을 필터링하는 것입니다. 다음 예에서는 4와 3이 중복임을 알고 싶습니다.

int[] listOfItems = new[] { 4, 2, 3, 1, 6, 4, 3 };
var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);
foreach (var d in duplicates)
    Console.WriteLine(d); // 4,3

중복이 목록의 초기에 존재하는 경우 단락을 허용하기 위해 a를 추가하고 HashSet<T>해당 .Add메서드 의 반환 값을 확인할 수 있습니다 .

를 사용 .Any하면 중복을 찾는 즉시 열거 형을 단락시킬 수 있습니다.

다음은 C # 및 VB 모두의 LINQ 확장 메서드입니다.

CSharp :

public static bool ContainsDuplicates<T>(this IEnumerable<T> enumerable)
{
    var knownKeys = new HashSet<T>();
    return enumerable.Any(item => !knownKeys.Add(item));
}

비주얼 베이직 :

<Extension>
Public Function ContainsDuplicates(Of T)(ByVal enumerable As IEnumerable(Of T)) As Boolean
    Dim knownKeys As New HashSet(Of T)
    Return enumerable.Any(Function(item) Not knownKeys.Add(item))
End Function

참고 : 중복 없는지 확인하려면 다음으로 변경하십시오 Any.All


모든 항목을 세트에 배치하고 세트의 개수가 목록의 개수와 다른 경우 중복 항목이 있습니다.

bool hasDuplicates<T>(List<T> myList) {
    var hs = new HashSet<T>();

    for (var i = 0; i < myList.Count; ++i) {
        if (!hs.Add(myList[i])) return true;
    }
    return false;
}

모든 목록을 살펴볼 필요가 없기 때문에 Distinct보다 더 효율적이어야합니다.


이 라인을 따라가는 것은 비교적 간단하며 중복 수를 제공합니다.

var something = new List<string>() { "One", "One", "Two", "Three" };

var dictionary = new Dictionary<string, int>();

something.ForEach(s =>
    {
        if (dictionary.ContainsKey(s))
        {
            dictionary[s]++;
        }
        else
        {
            dictionary[s] = 1;
        }
    });

확실하지는 않지만 이것이 Distinct의 구현과 유사하다고 생각합니다.


IEnumerable.GroupBy 메서드를 사용할 수 있습니다.

var list = new List<string> {"1", "2","3", "1", "2"};
var hasDuplicates = list.GroupBy(x => x).Any(x => x.Skip(1).Any());

IEnumerable에 대해 Distinct () 확장 메서드를 사용할 수 있습니다.


정수 또는 잘 정렬 된 집합을 사용하는 경우 O (nlog n) 성능을 위해 이진 트리를 사용하십시오.

또는 다른 빠른 정렬 방법을 찾은 다음 모든 값이 이전 값과 다른지 확인하십시오.


다음 Enumerable.Any과 함께 사용 HashSet.Add:

List<string> list = new List<string> {"A", "A", "B", "C", "D"};
HashSet<string> hashSet = new HashSet<string>();
if(list.Any(r => !hashSet.Add(r)))
{
   //duplicate exists. 
}

HashSet.Add반환 false항목이 이미 존재하는 경우 HashSet. 이것은 전체 목록을 반복하지 않습니다.


You could use Distinct() statement to find unique records. Then compare with original generic list like this:

  if (dgCoil.ItemsSource.Cast<BLL.Coil>().ToList().Count != dgCoil.ItemsSource.Cast<BLL.Coil>().Select(c => c.CoilNo).Distinct().Count())
  {    
    //Duplicate detected !!
    return;
  }

Not seen anybody do this yet so here is a little program I just wrote. It's simple enough. Using Contains(), though I don't know how scalable this method is.

       Console.WriteLine("Please enter 5 unique numbers....");
        List<int> uniqueNums = new List<int>() { };
        while (uniqueNums.Count < 5)
        {
            int input = Convert.ToInt32(Console.ReadLine());
            if (uniqueNums.Contains(input))
            {
                Console.WriteLine("Add a different number");
            }
            uniqueNums.Add(input);
        }
        uniqueNums.Sort();
        foreach (var n in uniqueNums)
        {
            Console.WriteLine(n);
        }

참고URL : https://stackoverflow.com/questions/5080538/c-sharp-determine-duplicate-in-list

반응형