C# - 将集合与自身进行比较以查找重复项的最快方法

Bob*_*way 3 c# collections duplicates

public class TestObject
{
    string TestValue { get; set; }
    bool IsDuplicate { get; set; }
}

List<TestObject> testList = new List<TestObject>
{
    new TestObject { TestValue = "Matt" },
    new TestObject { TestValue = "Bob" },
    new TestObject { TestValue = "Alice" },
    new TestObject { TestValue = "Matt" },
    new TestObject { TestValue = "Claire" },
    new TestObject { TestValue = "Matt" }
};
Run Code Online (Sandbox Code Playgroud)

想象testList实际上是数百万个物体.

什么是确保两个这三个最快的方法TestObjectsTestValue的马特获取其IsDuplicate设置为true?无论给定值的实例如何,只有一个应该在IsDuplicate为false的过程中出现.

我并不反对通过线程来做这件事.如果将集合转换为其他集合类型更快,则集合不必是列表.

我需要保留重复项并将其标记为这样,而不是从集合中删除它们.

要扩展,这是(正如您可能想到的)一个更复杂问题的简单表达.有问题的对象已经有了一个序数,我可以使用它来订购它们.

在确切的字符串相等性上匹配初始重复之后,我将不得不再次返回该集合并使用一些模糊匹配逻辑重新尝试其余部分.在重复数据删除期间或之后,不会更改此过程开始时存在的集合.

最终,原始集合将被写入文件,可能会重复标记.

Iva*_*nko 11

正如其他人提到的,这里正确的方法是使用HashSet类.

var hashSet = new HashSet<string>();

foreach (var obj in testList)
{
    if (!hashSet.Add(obj.TestValue))
    {
        obj.IsDuplicate = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

当您第一次向HashSet添加值时,它会成功添加并且HashSet.Add()方法返回true,因此您不会对该项进行任何更改.当您尝试第二次添加它时,HashSet.Add()返回false并将您的项目标记为重复项.

完成运行我们的标记重复方法后,该列表将具有以下状态:

Matt
Bob
Alice
Claire
Matt DUPLICATE
Run Code Online (Sandbox Code Playgroud)