2013-09-01 2 views
0

나는 LINQ (이 포럼 덕분에)를 사용하여 중복을 찾을 수 있지만 한 목록으로 목록을 병합 한 후 어떻게 이런 사전을 검색 할 수 있습니까?여러 목록에서 중복 선택

KEY -> duplicate value | VALUE -> list index where duplicate was found 

는 사실은 내가이 일을 해요 :

List<int> duplicates = hits.GroupBy(x => x) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key) 
    .ToList(); 

추측은 당신이 당신의 요소 w를 나타내는 인덱스에 "추가"모든 SelectMany

답변

3

당신은 (항목, 인덱스)에 모든 요소를 ​​매핑 할 수 있습니다 후 선택에 영향 인덱스를 쉽게 찾아 볼 수이 입력에 예를 들어

, 각 키에 대해

var duplicates = hits.Select((item, index) => new {item, index}) 
    .GroupBy(x => x.item) 
    .Where(g => g.Count() > 1) 
    .Select(g => new {Key = g.Key, Indexes = g.ToList().Select(x => x.index)}) 
    .ToList(); 
+0

매우 세련된 : D –

2

먼저 사용해야합니다 hich 목록에 포함되어 있으며, 이들 모두를 병합하고, 마지막으로 코드와 비슷한 것을 사용합니다.

var query = arr.Select((x,i) => x.Select(y=>new{Elem = y, Index = i})) 
    .SelectMany(x=>x) 
    .GroupBy(x => x.Elem) 
    .Where(x => x.Count() > 1) 
    .ToDictionary(x => x.First().Elem, y => y.Select(z => z.Index).ToList()); 

가장 큰 차이점

당신이 당신의 중복이 발견되는 인덱스의 목록을 구축해야하기 때문에 당신이 사전을 만드는 방법이다. 당신이 얻을

List<int>[] arr = new List<int>[3]; 
arr[0] = new List<int>() { 1, 2, 3 }; 
arr[1] = new List<int>() { 1 }; 
arr[2] = new List<int>() { 1, 3 }; 

:

[1, {0,1,2}] 
[3, {0,2}]