如何显示数组元素出现的次数?

6
我是新手学习C#,希望在这个话题上得到一些帮助。我有一个元素数组,需要显示每个项目出现的次数。
比如,在[1, 2, 3, 4, 4, 4, 3]中,1出现了一次,4出现了三次,以此类推。
我已经做了以下工作,但不知道如何将它放在foreach/if语句中...
int[] List = new int[]{1,2,3,4,5,4,4,3};
foreach(int d in List)
{
    if("here I want to check for the elements")
}

谢谢您,如果这是一个非常基础的问题,请见谅...


如果这是作业,请标记为作业。 - FishBasketGordo
不是的,我只是在学习并尝试做到这一点 :-) - Momo
1
尝试使用 Dictionary<int, int>,其中每个键表示一个唯一条目,值表示计数。每次命中现有键时,将其值增加1。 - Chris Sinclair
可能是[c#:在列表中计算出现次数的方法]的重复问题(https://dev59.com/a3M_5IYBdhLWcg3w-4nw) - JonH
5个回答

12
你可以通过使用Enumerable.GroupBy来处理此问题。我建议查看C# LINQ示例中的Count和GroupBy部分以获得指导。
在你的情况下,可以这样实现:
int[] values = new []{1,2,3,4,5,4,4,3};

var groups = values.GroupBy(v => v);
foreach(var group in groups)
    Console.WriteLine("Value {0} has {1} items", group.Key, group.Count());

7

您可以保留一个Dictionary的项目以及它们相关的数量。在下面的例子中,dict[d]是通过它的值来引用一个元素。例如,d = 4

int[] List = new int[]{1,2,3,4,5,4,4,3};
var dict = new Dictionary<int, int>();
foreach(int d in List)
{
    if (dict.ContainsKey(d))
        dict[d]++;
    else
        dict.Add(d, 1);
}

foreach循环结束时,您将拥有每个dict中唯一值的一个条目。您可以通过访问dict[d]来获取每个项目的计数,其中d是原始列表中的某个整数值。

3

LINQ的解答很好,但如果您想自己完成:

int[] numberFound = new int[6];
int[] List = new int[] { 1, 2, 3, 4, 5, 4, 4, 3 };
foreach (int d in List)
{
    numberFound[d]++;
}

你为什么在numberFound中分配了6个空间,但实际上只有5个呢? - JonH
@JonH 这样,numberFound[x] 将对应于 x,而不是 x-1。(numberFound 的范围将从0到5。) - ispiro

1
var list = new int[] { 1, 2, 3, 4, 5, 4, 4, 3 };
var groups = list.GroupBy(i => i).Select(i => new { Number = i.Key, Count = i.Count() });

-1

私有静态方法计算单循环中的出现次数()

{

        int[] intergernumberArrays = { 1, 2, 3, 4, 1, 2, 4, 1, 2, 3, 5, 6, 1, 2, 1, 1, 2 };

        Dictionary<int, int> NumberOccurence = new Dictionary<int, int>();
        for (int i = 0; i < intergernumberArrays.Length; i++)
        {
            if (NumberOccurence.ContainsKey(intergernumberArrays[i]))
            {
                var KeyValue = NumberOccurence.Where(j => j.Key == intergernumberArrays[i]).FirstOrDefault().Value;
                NumberOccurence[intergernumberArrays[i]] = KeyValue + 1;
            }
            else
            {
                NumberOccurence.Add(intergernumberArrays[i], 1);
            }
        }
        foreach (KeyValuePair<int, int> item in NumberOccurence)
        {
            Console.WriteLine(item.Key + " " + item.Value);
        }
        Console.ReadLine();

    }

1
这与4.5年前@Yuck的答案是相同的概念,只不过该解决方案每次遇到新值时都会迭代数组的其余部分,而该解决方案确保每个数组元素仅被访问一次。另外,检索类型为int的数组元素,将其格式化为string,然后将其解析回int的目的是什么?为什么不直接使用intergernumberArrays[i]而不是int.Parse(intergernumberArrays[i].ToString()) - Lance U. Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接