代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

用.NET/C计算集合的频率分布#

  •  2
  • Paul Sasik  · 技术社区  · 15 年前

    有没有一种快速/简单的方法可以使用LINQ或其他方法计算.NET集合的频率分布?

    例如:一个任意长的列表包含许多重复。什么是浏览列表和计算/跟踪重复的聪明方法?

    3 回复  |  直到 15 年前
        1
  •  2
  •   James Black    15 年前

    最简单的方法是使用hashmap,使用值作为键并增加值,或者选择一个bucket大小(bucket 1=1-10,bucket 2=11-20,等等),并按值增加每个bucket。

    然后你可以通过测试来确定频率。

        2
  •  5
  •   SLaks    15 年前

    在列表中查找重复项的最简单方法是对其进行分组,如下所示:

    var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());
    

    (写作 Skip(1).Any() 应该比(count()>1)快,因为它不需要从每个组遍历两个以上的项。然而,这种差异可能可以忽略不计,除非 list 的枚举器慢)

        3
  •  1
  •   Marcus Griep    15 年前

    这个 C5 generic collections library 有一个 HashBag 通过计数接受重复项的实现。以下伪代码将为您提供所需的内容:

    var hash = new HashBag();
    hash.AddAll(list);
    var mults = hash.ItemMultiplicities();
    

    (何处) K 是列表中项目的类型) mults 然后将包含 IDictionary<K,int> 其中列表项是键,多重性是值。

    推荐文章