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

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" }
};

想象一下testList实际上是数百万个对象.

确保具有Matt TestValue的三个TestObject中的两个将其IsDuplicate设置为true的最快方法是什么?无论给定值的实例如何,只有一个应该在IsDuplicate为false的过程中出现.

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

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

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

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

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

解决方法:

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

var hashSet = new HashSet<string>();

foreach (var obj in testList)
{
    if (!hashSet.Add(obj.TestValue))
    {
        obj.IsDuplicate = true;
    }
}

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

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

Matt
Bob
Alice
Claire
Matt DUPLICATE
上一篇:java – 从数组中删除重复项(没有集合或排序)


下一篇:javascript – 选择2多选重复值