我目前正在尝试找到从列表中删除项目的最干净,最高效的方法,这些项目具有为我的对象列表的某个属性指定的重复值。请参阅以下示例:
public class MyModel
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
}
现在,假设我有List<MyModel> models
,其中可能包含数千个条目。我希望能够删除除PropertyB相同的一个(第一个)之外的所有条目。
我认为这样做的唯一方法似乎是对性能非常不利,我想找到一种不同的方式 - 目前的想法如下:
List<MyModel> models = //initialized externally, contains thousands of records
List<MyModel> noDuplicatePropertyBs = new List<MyModel>();
List<string> propertyBs = new List<string>();
foreach(var model in models)
{
if(!propertyBs.Contains(model.PropertyB))
{
noDuplicatePropertyBs.Add(model);
propertyBs.Add(model.PropertyB);
}
}
编辑:请注意,我认为我可以覆盖我的MyModel
类中的基本Equals方法,仅使用.Distinct()方法比较PropertyB但是我已经有一个被覆盖的Equals方法,这是许多其他部分所必需的项目的覆盖(为了这个目的而覆盖equals方法似乎不是一个好主意,因为业务逻辑明智,对象需要所有3个属性相等才能使对象相等)
答案 0 :(得分:2)
将propertyBs
设为HashSet<string>
而不是List<string>
,并使用Add
的返回值做出决定:
var propertyBs = new HashSet<string>();
var res = models.Where(m => propertyBs.Add(m.PropertyB)).ToList();
当你在哈希集上调用Add
时,只有初始项的添加返回true
;所有重复的添加都会返回false
,因此会过滤掉相应的模型。
答案 1 :(得分:0)
我可能的解决方案是使用Linq Group by功能。 请看一下:Group by in LINQ