2010-08-12 3 views
6

.NET 3.5 프로젝트에서 형식 문자열 목록이 있습니다. 목록에는 수천 개의 문자열이 있지만 간단하게하기 위해 문자열에는 5 개의 문자열 만 있습니다.중복 목록에 대한 쿼리

List<string> lstStr = new List<string>() { 
      "Apple", "Banana", "Coconut", "Coconut", "Orange"}; 

목록이 정렬되어 있다고 가정합니다 (위에서 알 수있는 것처럼). 내가 필요한 건 이 아닌 모든 문자열을 제거하는 LINQ 쿼리입니다. 중복입니다. 따라서 결과는 두 개의 "코코넛"문자열 만 포함하는 목록을 남겨 둡니다.

LINQ 쿼리와 관련이 있습니까? 그렇지 않다면 나는 할 수있는 몇 가지 복잡한 for 루프에 의존해야 할 것이다. 그러나해야만하지 않는 한 나는 원하지 않았다. 첫 번째는 O (n²) 시간이 걸립니다 (그러나 정렬 된 목록을지지 않습니다) 모든 요소에 대한 목록을 열거하는 것이

답변

4

중복을 찾기위한 코드가

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

var dupes = lstStr.Where(x => lstStr.Sum(y => y==x ? 1 : 0) > 1);

또는

var dupes = lstStr.Where((x,i) => ( (i > 0 && x==lstStr[i-1]) 
            || (i < lstStr.Count-1 && x==lstStr[i+1])); 

참고. 두 번째는 O (n) (정렬 된 목록으로 가정)입니다.

0
var temp = new List<string>(); 

foreach(var item in list) 
{ 
    var stuff = (from m in list 
       where m == item 
       select m); 
    if (stuff.Count() > 1) 
    { 
     temp = temp.Concat(stuff); 
    } 
} 
1

이것은 작동해야하며, 다른 답변의 O (N^2)가 아니라 O (N)입니다. (참고로이 목록은 정렬되어 있으므로 실제로 필요합니다.) 이 같은

IEnumerable<T> OnlyDups<T>(this IEnumerable<T> coll) 
    where T: IComparable<T> 
{ 
    IEnumerator<T> iter = coll.GetEnumerator(); 
    if (iter.MoveNext()) 
    { 
     T last = iter.Current; 
     while(iter.MoveNext()) 
     { 
      if (iter.Current.CompareTo(last) == 0) 
      { 
        yield return last; 
        do 
        { 
         yield return iter.Current; 
        } 
        while(iter.MoveNext() && iter.Current.CompareTo(last) == 0); 
      } 
      last = iter.Current; 
     } 
} 

사용을 :

IEnumerable<string> onlyDups = lstStr.OnlyDups(); 

또는 여기

List<string> onlyDups = lstStr.OnlyDups().ToList(); 
+0

이 LINQ를 사용하지 않는 arrya 문자열을 형성한다? – McKay

+0

@McKay : 예,하지만 OP는 목록이 정렬되어 있다고 가정 할 수 있다고 말했습니다. –

+0

@McKey (수정 된 질문) : 기술적으로는 아니지만 linq 스타일의 인터페이스를 유지하며 더 큰 LINQ 문에 사용할 수 있습니다. –

관련 문제