如何计算值在同一个数组中重新出现的次数?

时间:2014-09-22 22:44:27

标签: c# arrays nested-loops

正如标题所说,我正在尝试计算值在同一个数组中重新出现的次数。因此,例如,如果存在值为1,1,2,2的数组,则输出将类似于:值(1)发生(2)次\ n值(2)发生(2)次。这是我到目前为止所做的:

foreach (var i in anArray)
{
    foreach (var m in secondArray)
    {
        if (i == m)
        {
            count++;
        }
    }
    Console.WriteLine("\nValue " + i + " occurred " + count + " times"); 
}

我创建了第一个数组(secondArray)的副本,并且我正在尝试比较数组,但有些事情是不对的。嵌套循环计算两次我的值。因此,它会说:value(1)发生(2)次,下一个读数说:value(1)发生(4)次,而不是继续下一个不是(1)的值。我意识到它正在计算第二个(1)并将之前的计数添加到它...至少我认为我意识到了。我怎样才能使用数组而没有列表来解决这个问题?

5 个答案:

答案 0 :(得分:2)

在您当前的设计中,您可以直接设置计数:

foreach (var i in anArray)
{
    count = 0; // Initialize each loop
    foreach (var m in secondArray)
    {
        if (i == m)
        {
            count++;
        }
    }
    Console.WriteLine("\nValue " + i + " occurred " + count + " times"); 
}

话虽这么说,你可以从第二个数组构建一个字典,并使用它:

var dict = secondArray.GroupBy(v => v).ToDictionary(g => g.Key, g => g.Count());
foreach(var i in anArray)
{
    if (dict.ContainsKey[i])
        Console.WriteLine("\nValue " + i + " occurred " + dict[i] + " times"); 
    else
        Console.WriteLine("\nValue " + i + " occurred 0 times"); 
}

答案 1 :(得分:2)

您可以使用linq

var counts = anArray.Concat(secondArray)
   .GroupBy(x => x)
   .Select(g => new { Number = g.Key, Count = g.Count() });

foreach(var c in counts)
{
     Console.WriteLine("\nValue " + c.Number + " occurred " + c.Count + " times"); 
}

答案 2 :(得分:1)

使用group by,你可以将它作为一个衬里来显示出现...

 anArray.GroupBy(a => a).ToList()
     .ForEach(g => Console.WriteLine("Value {0} occurs {1} times", g.Key, g.Count()));

答案 3 :(得分:1)

另一个版本:

foreach (var distinctItem in anArray.Distinct())
{
    Console.WriteLine("\nValue '{0}' occurred '{1}' times.", distinctItem,
        anArray.Count(i => i == distinctItem));
}

答案 4 :(得分:0)

您可以将system.linq名称空间添加到您的班级,然后:

 var result = l.GroupBy(a => a).Select(s => new {Key= s.Key ,Counter= s.Count()});
  foreach (var item in result)
     Console.WriteLine("Value {0} occurred {1} times",item.Key,item.Counter);