나는 List<Location> locations
이 있습니다.목록에서 중복 필터
Location
클래스의 속성은 Coordinates
입니다. 문자열을 가정합니다.
좌표가 중복 된 위치를 제거하고 별도의 목록에 배치하려면 어떻게하나요? 두 개의 목록이 있습니다. 하나는 중복 용이고 하나는없는 것입니다.
나는 List<Location> locations
이 있습니다.목록에서 중복 필터
Location
클래스의 속성은 Coordinates
입니다. 문자열을 가정합니다.
좌표가 중복 된 위치를 제거하고 별도의 목록에 배치하려면 어떻게하나요? 두 개의 목록이 있습니다. 하나는 중복 용이고 하나는없는 것입니다.
정말 무슨 뜻인지에 따라 다릅니다. 당신은 고유 해당 항목에 대한 하나 개의 목록을 원하는 경우, 다른 한편으로
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);
}
은> (당신이 선택한 속성에 따라 개체를 비교할 수 있습니다) 첫 번째 작업 중 하나가 될 것입니다.
Linq를 사용하여 고유 항목을 가져 오려면 Distinct() 메소드를 사용할 수 있습니다.
그런 다음 원본 목록에서 중복 컬렉션을 남길 수있는 항목을 제거 할 수 있습니다. 제외에 대한
var distinctObjects = originalList.Distinct();
var duplicateList = originalList.Except(distinctObjects);
당신은 별개의 사용자 지정 같음 비교를 사용해야합니다
하지만 하지
.
.ToList()는 컬렉션을 열거합니다. 필요하지 않으면 그것을하지 마십시오 :-) –
@Tuomas Hietanen : 사실, OP는 * list * -output을 요구합니다. – Ani