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
'program tip' 카테고리의 다른 글
루비에서 임의의 10 자리 숫자를 생성하려면 어떻게해야합니까? (0) | 2020.11.29 |
---|---|
Twitter 애플리케이션 용 Android Intent (0) | 2020.11.29 |
정규식 : 목록에서 검색 (0) | 2020.11.29 |
jQuery로 입력 값을 어떻게 비우나요? (0) | 2020.11.29 |
Google 리 마케팅 태그-iframe 높이 문제 (0) | 2020.11.29 |