Это зависит от того, что вы имеете в виду, действительно. Если вы хотите один репрезентативной списка, а другой для остальных дублей, вы могли бы сделать:
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();
Это немного неэффективно, так как оно перечисляет поиск дважды. Немного лучше было бы что-то вроде:
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);
}
.ToList() перечисляет коллекцию. Не делайте этого, если вам это не нужно ... :-) –
@Tuomas Hietanen: Хотя верно, OP запрашивает * list * -output. – Ani