正如标题所说,我正在尝试计算值在同一个数组中重新出现的次数。因此,例如,如果存在值为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)并将之前的计数添加到它...至少我认为我意识到了。我怎样才能使用数组而没有列表来解决这个问题?
答案 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);