【问题标题】:Difference of two lists C#两个列表的区别C#
【发布时间】:2012-08-11 09:38:06
【问题描述】:

我有两个字符串列表,它们都是约 300,000 行。清单 1 比清单 2 多几行。我要做的是找到清单 1 中但不在清单 2 中的字符串。

考虑到我必须比较多少个字符串,Except() 是否足够好或者有更好(更快)的东西?

【问题讨论】:

  • 如果您注意到性能下降,这只是一个问题。性能问题实际上只能由您来回答,因为只有您知道对您的应用程序而言“太慢”是什么。考虑最终用户、目标平台等。
  • 如果重复行不是问题,您可以使用 HashSet 和 Contains 方法。 msdn.microsoft.com/en-us/library/bb356440.aspx
  • 从列表移动到哈希表,然后只使用包含似乎是快速获得非常接近最佳性能的好方法
  • IEnumerable/List.Except 已经在内部使用 [Hash]Set(这就是为什么它不保证排序并使用IEquatable)作为标准列表..只需使用它(因为它有一个非常好的 Big-O)然后 然后 看看是否需要做任何事情..
  • (糟糕,我指的是 IEqualityComparer 而不是 IEquatable。)

标签: c# list set-difference


【解决方案1】:

我的建议:

    HashSet<String> hash1 = new HashSet<String>(new string[] { "a", "b", "c", "d" });
    HashSet<String> hash2 = new HashSet<String>(new string[] { "a", "b" });
    List<String> result = hash1.Except(hash2).ToList();

【讨论】:

    【解决方案2】:

    在内部,可枚举的Except 扩展方法使用Set&lt;T&gt; 来执行计算。它将与任何其他方法一样快。

    使用list1.Except(list2)

    它会给你最好的性能和最简单的代码。

    【讨论】:

    • 正如 Jonathan 指出的那样,可能对一个(或两个)列表使用 HashSet 是有意义的,因为 Except 可以避免创建立即 [ Hash]Sets .. 当然,这意味着原始数据排序并不重要,不允许重复,并且差异已执行了足够多的时间以使其重要..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多