如何快速查找List <T>中的重复项,并更新原始集合

Chr*_*ris 5 linq sorting generics

让我首先说我已经阅读了这些问题:12,我明白我可以编写代码来查找我的列表中的重复项,但我的问题是我想更新原始列表而不仅仅是查询和打印重复项.

我知道我不能更新查询返回的集合,因为它不是一个视图,它是一个匿名类型IEnumerable<T>.

我希望能够在列表中找到重复项,并标记我创建的属性,该属性State稍后在应用程序中使用.

有没有人遇到这个问题,你能指出我正确的方向吗?

ps我正在使用ATM的方法是一个冒泡排序类型循环,逐项遍历列表并比较关键字段.显然这不是最快的方法.

编辑:

为了将列表中的项目视为"重复",有三个必须匹配的字段.我们将它们称为Field1,Field2和Field3

我在基类上有一个重载的Equals()方法,用于比较这些字段.

我在跳过对象的唯一时间MarkDuplicates()的方法是如果对象状态是UNKNOWNERROR,否则,我测试了.

如果您需要更多详细信息,请告诉我们.

再次感谢!

Jar*_*Par 8

我认为最简单的方法是从编写一个扩展方法开始,该方法在对象列表中找到重复项.由于您的对象使用.Equals(),因此可以在大多数常见集合中进行比较.

public static IEnumerable<T> FindDuplicates<T>(this IEnumerable<T> enumerable) {
  var hashset = new HashSet<T>();
  foreach ( var cur in enumerable ) { 
    if ( !hashset.Add(cur) ) {
      yield return cur;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,为重复项更新您的集合应该非常容易.例如

List<SomeType> list = GetTheList();
list
  .FindDuplicates()
  .ToList()
  .ForEach(x => x.State = "DUPLICATE");
Run Code Online (Sandbox Code Playgroud)

如果已经在代码中定义了ForEach扩展方法,则可以避免使用.ToList.