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(组);
}
创建IEqualityComparervar distinctObjects = originalList.Distinct();
var duplicateList = originalList.Except(distinctObjects);
您将需要为distinct(不同)而不是except(除外)使用自定义相等比较器。。ToList()枚举集合。如果你不需要就不要做…:-)@Tuomas Hietanen:虽然是真的,但OP要求列表输出。