Chr*_*ris 5 linq sorting generics
让我首先说我已经阅读了这些问题:1和2,我明白我可以编写代码来查找我的列表中的重复项,但我的问题是我想更新原始列表而不仅仅是查询和打印重复项.
我知道我不能更新查询返回的集合,因为它不是一个视图,它是一个匿名类型IEnumerable<T>.
我希望能够在列表中找到重复项,并标记我创建的属性,该属性State稍后在应用程序中使用.
有没有人遇到这个问题,你能指出我正确的方向吗?
ps我正在使用ATM的方法是一个冒泡排序类型循环,逐项遍历列表并比较关键字段.显然这不是最快的方法.
编辑:
为了将列表中的项目视为"重复",有三个必须匹配的字段.我们将它们称为Field1,Field2和Field3
我在基类上有一个重载的Equals()方法,用于比较这些字段.
我在跳过对象的唯一时间MarkDuplicates()的方法是如果对象状态是UNKNOWN或ERROR,否则,我测试了.
如果您需要更多详细信息,请告诉我们.
再次感谢!
我认为最简单的方法是从编写一个扩展方法开始,该方法在对象列表中找到重复项.由于您的对象使用.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.