Это зависит от того, что вы имеете в виду, на самом деле. Если вам нужен один представительский список и еще один для оставшихся дубликатов, вы можете сделать:
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);
}