2011-02-07 7 views
4

나는 List<Location> locations이 있습니다.목록에서 중복 필터

Location 클래스의 속성은 Coordinates입니다. 문자열을 가정합니다.

좌표가 중복 된 위치를 제거하고 별도의 목록에 배치하려면 어떻게하나요? 두 개의 목록이 있습니다. 하나는 중복 용이고 하나는없는 것입니다.

답변

3

정말 무슨 뜻인지에 따라 다릅니다. 당신은 고유 해당 항목에 대한 하나 개의 목록을 원하는 경우, 다른 한편으로

var locationsByCoordinates = locations.ToLookup(location => location.Coordinates); 

var distinct = locationsByCoordinates.Select(group => group.First()) 
            .ToList(); 

var duplicates = locationsByCoordinates.SelectMany(group => group.Skip(1)) 
             .ToList(); 

, 또 다른 : 한 대표 목록, 나머지 중복에 대한 또 다른 하나를 원하는 경우에, 당신은 할 수 그렇지 않은 경우 :

var distinct = locationsByCoordinates.Where(group => group.Count() == 1) 
            .Select(group => group.Single()) 
            .ToList(); 

var duplicates = locationsByCoordinates.Where(group => group.Count() != 1) 
             .SelectMany(group => group) 
             .ToList(); 

이것은 조회가 두 번 열거되기 때문에 약간 비효율적입니다. 같은 약간 더 나은 무언가 : IEqualityComparer < 위치를 만들기

var distinct = new List<Location>(); 
var duplicates = new List<Location>(); 

foreach(var group in locationsByCoordinates) 
{ 
    var target = group.Count() == 1 ? distinct : duplicates; 
    target.AddRange(group); 
} 
+1

.ToList()는 컬렉션을 열거합니다. 필요하지 않으면 그것을하지 마십시오 :-) –

+1

@Tuomas Hietanen : 사실, OP는 * list * -output을 요구합니다. – Ani

4

은> (당신이 선택한 속성에 따라 개체를 비교할 수 있습니다) 첫 번째 작업 중 하나가 될 것입니다.

Linq를 사용하여 고유 항목을 가져 오려면 Distinct() 메소드를 사용할 수 있습니다.

그런 다음 원본 목록에서 중복 컬렉션을 남길 수있는 항목을 제거 할 수 있습니다. 제외에 대한

var distinctObjects = originalList.Distinct(); 
var duplicateList = originalList.Except(distinctObjects); 
당신은 별개의 사용자 지정 같음 비교를 사용해야합니다

하지만 하지

.