C#根据不同的字段从列表中删除条目

时间:2017-06-28 18:18:09

标签: c#

我目前正在尝试找到从列表中删除项目的最干净,最高效的方法,这些项目具有为我的对象列表的某个属性指定的重复值。请参阅以下示例:

  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个属性相等才能使对象相等)

2 个答案:

答案 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