【问题标题】:How to display how many times an array element appears如何显示数组元素出现的次数
【发布时间】:2012-08-04 18:16:16
【问题描述】:

我是 C# 新手,希望能在这个话题上得到一些帮助。我有一个包含元素的数组,我需要显示每个项目出现的次数。

比如[1, 2, 3, 4, 4, 4, 3]中,1出现1次,4出现3次,以此类推。

我做了以下但不知道如何把它放在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")
}

谢谢你,如果这是一个非常基本的问题,我很抱歉......

【问题讨论】:

  • 如果这是作业,请标记它。
  • 不,不是,我只是在学习和尝试这样做:-)
  • 尝试使用Dictionary<int, int>,其中每个键代表一个唯一条目,值代表一个计数。每次点击现有键时,将其值增加 1。

标签: c# arrays


【解决方案1】:

您可以通过Enumerable.GroupBy 处理此问题。我建议查看有关 Count 和 GroupBy 的 C# LINQ samples 部分以获取指导。

在你的情况下,这可以是:

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());

【讨论】:

    【解决方案2】:

    您可以保留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 所以 numberFound[x] 将对应于 x,而不是 x-1。 (numberFound 的范围从 0 到 5。)
      【解决方案4】:
      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() });
      

      【讨论】:

        【解决方案5】:

        私有静态无效CalculateNumberOfOccurenceSingleLoop()

        {

                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();
        
            }
        

        【讨论】:

        • 这与 4.5 年前的 @Yuck's answer 概念相同,只是解决方案只访问每个数组元素一次,并且每次遇到新值时都会遍历数组的其余部分。另外,检索int 类型的数组元素,将其格式化为string,然后将其解析回int 的目的是什么?为什么不直接使用intergernumberArrays[i] 而不是int.Parse(intergernumberArrays[i].ToString())
        猜你喜欢
        • 1970-01-01
        • 2020-10-26
        • 2015-08-13
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2023-02-25
        相关资源
        最近更新 更多