从列表中删除重复项的最有效方法

2023-12-21

假设我有一个包含重复值的列表,并且我想删除重复项。

List<int> myList = new List<int>(Enumerable.Range(0, 10000));

// adding a few duplicates here
myList.Add(1); 
myList.Add(2);
myList.Add(3);

我找到了 3 种方法来解决这个问题:

List<int> result1 = new HashSet<int>(myList).ToList(); //3700 ticks
List<int> result2 = myList.Distinct().ToList(); //4700 ticks
List<int> result3 = myList.GroupBy(x => x).Select(grp => grp.First()).ToList(); //18800 ticks
//referring to pinturic's comment:
List<int> result4 = new SortedSet<int>(myList).ToList(); //18000 ticks

在关于 SO 的大多数答案中,Distinct方法被显示为“正确的方法”,但 HashSet 总是更快!

我的问题:使用时有什么需要注意的吗?HashSet方法还有其他更有效的方法吗?


这两种方法有很大的区别:

List<int> Result1 = new HashSet<int>(myList).ToList(); //3700 ticks
List<int> Result2 = myList.Distinct().ToList(); //4700 ticks

第一个可以(可能会)改变返回的元素的顺序List<>: Result1元素的顺序不会相同myList的。第二个保持原来的顺序。

可能没有比第一种更快的方法了。

可能没有比第二个“更正确”的了(对于基于排序的“正确”的某个定义)。

(第三个和第二个类似,只是慢一些)

只是出于好奇,Distinct() is:

// Reference source http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,712
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    return DistinctIterator<TSource>(source, null);
}

// Reference source http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,722
static IEnumerable<TSource> DistinctIterator<TSource>(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) {
    Set<TSource> set = new Set<TSource>(comparer);
    foreach (TSource element in source)
        if (set.Add(element)) yield return element;
}

所以最后Distinct()只需使用一个内部实现HashSet<>(称为Set<>) 检查项目的唯一性。

为了完整起见,我将添加问题的链接C# Distinct() 方法是否保持序列的原始顺序不变? https://stackoverflow.com/q/4734852/613130

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从列表中删除重复项的最有效方法 的相关文章

随机推荐

  • 如何删除列表中的复选框

    我懂了堆栈闪电战 https stackblitz com edit list examples file app 2Fselection list 2Fselection list component html具有选择的列表的示例 如下图
  • URLLoader 轮询时卡住

    更新 不知怎的 这在浏览器中运行 flash 时有效 但如果从 IDE 运行则不起作用 如果您遇到同样的问题 您可能想尝试在浏览器中运行 我正在制作一个聊天应用程序 它使用 Flash 和 Actionscript 3 0 从我的服务器重复
  • List.permute 的性能

    我实现了一个费舍尔 耶茨洗牌 http en wikipedia org wiki Fisher E2 80 93Yates shuffle The modern algorithm最近 它使用List permute对列表进行洗牌 并注意
  • 如何使用类似 SQL 的接口 INSERT 到 influxDB 中?

    是否有可能INSERT使用 InfluxDB 上类似 SQL 的接口将数据转换为系列 测量值 是的 您可以简单地INSERT线路协议字符串 https docs influxdata com influxdb v1 6 tools shel
  • 在 JavaScript 对象中将键值分配给另一个键值[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 例如 我知道可以在 Javascript 中设置带有前面键值的键值 var obj one yes two obj one obj two
  • 在 Joomla 中加载另一个模块中的模块

    我绝对是 Joomla 的初学者 我正在尝试在另一个模块中加载一个模块 但我找不到如何执行此操作 我一直在尝试添加 loadposition position 用 position 替换了我想要加载的模块的位置 但它似乎只在文章中起作用 我
  • StatelessSession 在 AbstractEntityPersister (Hibernate) 中被转换为 Session

    我正在尝试对 StatelessSession 进行简单的保存 有人能发现我做错了什么 导致 Hibernate 方法尝试将 StatelessSession 无效转换为 Session 如果有任何反馈 我将不胜感激 我的示例代码 Stat
  • python-click:格式化帮助文本

    这个问题是关于click https click palletsprojects com en 7 x 包裹 帮助的长文本未按预期显示 我尝试使用 b也一样 但似乎影响不大 cmd and powershell相同的代码有不同的结果 为什么
  • 在图像opencv上绘制矩形?

    我已经使用 python 中的 opencv 库加载了一个图像 现在我想使用鼠标绘制一个矩形 但是在绘制矩形时 矩形应该是可见的 以便绘制它的人可以以某种方式放置它 使感兴趣的对象完全可见在矩形中 但我的代码没有产生所需的输出 我的代码是
  • JQuery $('iframe').ready 为什么不起作用?

    我的父页面中有一个很长的 iframe 当您重新加载或单击 i 框架页面内的链接时 它会加载到其中 但纯窗口必须向上滚动 我尝试过各种代码示例 jquery哪个事件比这个更好 https stackoverflow com question
  • Node.js 是 Perl 和 Python 等传统脚本语言的可行替代品吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否有开源电子邮件消息(标头、附件等)解析器?

    是否有免费的开源解决方案将原始电子邮件消息 作为一段文本 并返回每个标头字段 每个附件和消息正文作为单独的字段 是的 对于你指出的每一种语言 我自己都在Python 中使用过 尝试仔细阅读您选择的库的库文档 注意 您可能期望有一个 不错的
  • mono:使用 monodevelop 可以进行远程调试吗?

    mono 使用 monodevelop 可以进行远程调试吗 我想远程调试在 CentOS 开发计算机上安装了 monodevelop 的远程 RHEL 服务器上运行的控制台应用程序 这对于 monodevelop 可能吗 这实际上可以通过软
  • 如何限制 haar 级联检测到的人脸数量

    我在情绪检测系统中使用 Haar 级联 我提供给模型的每个视频输入中只有一张脸 这是一项要求 当我运行 Haar 级联模型来检测人脸时 它有一些误报 由于视频中只有一张脸 因此我想选取检测到的最积极的区域并忽略所有其他检测 有没有办法做到这
  • 使用 htaccess 阻止所有人,除了来自特定引荐来源网址的访问者

    在 htaccess 中 如何阻止除来自特定域的访问者之外的所有访问者 我尝试了这个但没有成功 serve everyone from specific domain or specific user agent RewriteCond H
  • 在 Sitecore 中自定义子布局缓存

    在 Sitecore 中使用 WebControls 时 有一种方法可以自定义缓存行为 override获取缓存ID方法 有没有办法通过子布局 用户控件 实现类似的效果 我想添加自定义 VaryBy 选项 示例 Vary By Moon P
  • 仅保留数组中每个对象中选定的键[重复]

    这个问题在这里已经有答案了 下面 函数redux1删除与未列出的键相对应的条目keys to keep from data object 鉴于我有一个要保留的对象键列表 我该如何重写redux1以更清洁的方式 最好利用map filter
  • C++ 输出字符串没有 '\n' 或 endl 将在字符串末尾输出 '#'

    在ubuntu16 04上 我使用g 编译这样的代码 include
  • 大使回应“上游不健康”

    我有一个简单的 k3s 集群 并按照以下方式安装了大使入口控制器docs https www getambassador io yaml ambassador ambassador rbac yaml 当我尝试通过浏览器访问该服务时 我只是
  • 从列表中删除重复项的最有效方法

    假设我有一个包含重复值的列表 并且我想删除重复项 List