C# 从列表中筛选重复项

C# 从列表中筛选重复项,c#,.net,linq,list,duplicates,C#,.net,Linq,List,Duplicates,我有列表位置 Location类有一个属性Coordinates-假设为字符串 如何删除具有重复坐标的位置并将其放置到单独的列表中?有两个列表——一个用于重复列表,另一个不用于重复列表。这取决于你的意思,真的。如果您需要一份代表性列表,其余的副本需要另一份,您可以执行以下操作: var locationsByCoordinates = locations.ToLookup(location => location.Coordinates); var distinct = location

我有
列表位置

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();
但这有点低效,因为它会枚举两次查找。稍微好一点的是:

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);
}
var distinct=new List();
var duplicates=新列表();
foreach(位置B坐标中的var组)
{
var target=group.Count()==1?不同:重复;
target.AddRange(组);
}

创建IEqualityComparer将是您的首要任务之一(它允许您根据选择的属性比较对象)

如果希望使用Linq获得唯一的项,那么可以使用Distinct()方法

然后,您可以从原始列表中删除这些项目,这将为您留下一个重复的集合

var distinctObjects = originalList.Distinct();
var duplicateList = originalList.Except(distinctObjects);

您将需要为distinct(不同)而不是except(除外)使用自定义相等比较器。

。ToList()枚举集合。如果你不需要就不要做…:-)@Tuomas Hietanen:虽然是真的,但OP要求列表输出。