如何使用c#计算数字包的频率?

时间:2012-03-11 08:38:36

标签: c# frequency

有人可以帮我用c#运行这个程序。这个程序是计算数字的频率,例如12出现10x。在此之前,我尝试在水平线上对所有列表编号进行排序。然后我比较相同的数字,然后计算++,但直到知道我无法得到输出。

感谢您的帮助。

INPUT

46 31 46 9 25 12 45 33 25 12 12 12 28 36 38 28 25 12 12 9 36 38 36 36 12 9 36 12 12 25 28 34 36 36 9 12 16 25 28 44

输出

9 - 4 12-10 16 - 1 25 - 5 28 - 4 31 - 1 33 - 1 34 - 1 36 - 7 38 - 2 44 - 1 45-1 46 - 2

5 个答案:

答案 0 :(得分:4)

嗯,您可以使用Dictionary<int, int>手动执行此操作:

var frequencies = new Dictionary<int, int>();
foreach (var item in data)
{
    int currentCount;
    // We don't care about the return value here, as if it's false that'll
    // leave currentCount as 0, which is what we want
    frequencies.TryGetValue(item, out currentCount);
    frequencies[item] = currentCount + 1;
}

一种更简单但效率更低的方法是使用LINQ:

var frequencies = data.ToLookup(x => x) // Or use GroupBy. Equivalent here...
                      .Select(x => new { Value = x.Key, Count = x.Count() })
                      .ToList();
foreach (var frequency in frequencies)
{
    Console.WriteLine("{0} - {1}", frequency.Value, frequency.Count);
}

答案 1 :(得分:2)

假设您有一个数字列表:

var numbers = new List<int>{ 1, 2, 3, 4, 1, 2, 2, 3 };

然后我们可以使用Linq来实现你想要的目标:

var frequencies = 
    numbers.GroupBy( n => n ).Select( n => new { Value=n.Key, Count=n.Count() } );

foreach (var f in frequencies)
{
    Debug.WriteLine(string.Format("Value={0}, Frequency={1}", f.Value, f.Count));
}

答案 2 :(得分:1)

我会使用int和int的字典:Dictionary并在你去的时候迭代加上1的数字。一些解决方案使用数组,但我更喜欢字典,这样就无需管理数组的大小,并且内存效率更高。

int[] someValues = { /* your numbers */ }
Dictionary<int,int> Counts = new Dictionary<int,int>();
foreach(int key in someValues)
{
    if ( !Counts.HasKey(key) ) Counts[ key ] = 0;
    Counts[key] = Counts[key] + 1;
}

然后,你只需迭代字典输出:

foreach(KeyValuePair<int,int> kvp in Counts)
{
    Console.Write("{0} - {1}",kvp.Key,kvp.Value);
}

答案 3 :(得分:1)

我会将它们全部放入列表中,然后使用group by子句对它们进行分组,即

        List<int> numbers = new List<int> { 1, 2, 2, 3, 5, 6, 2, 1, 4, 4 };
        foreach (var group in numbers.GroupBy(n => n))
        {
            Console.WriteLine("{0} was found {1} times", group.Key, group.Count());
        }

答案 4 :(得分:0)

家庭作业?我们不是为你做家庭作业,但我会就你该做什么给你建议。

首先,我会有一个文本阅读器,因此您可以输入您的输入。然后,解析每个条目并将其添加到字典中。然后,通过字典迭代以查看特定条目发生的次数。