C# c-如何遍历字典并比较值?

C# c-如何遍历字典并比较值?,c#,dictionary,C#,Dictionary,我在自学c语言,并在做自己的小项目。程序用随机数填充数组,程序返回数字0-15及其在数组中出现的次数。我将这些值存储在字典中,因为我希望在不丢失映射到它的键的情况下对值进行排序 然后将排序后的值存储到另一个字典中,现在我希望能够遍历字典并获得具有最高值的键。换句话说,在控制台上打印出现次数最多的号码。在对字典进行排序时,最后一个数字将是最高值 然而,在大多数情况下,可能不止一个数字是并列的,这就是我一直坚持的地方。如果数字4、5、6、7出现的次数最多,我希望能够将其打印到控制台 Di

我在自学c语言,并在做自己的小项目。程序用随机数填充数组,程序返回数字0-15及其在数组中出现的次数。我将这些值存储在字典中,因为我希望在不丢失映射到它的键的情况下对值进行排序

然后将排序后的值存储到另一个字典中,现在我希望能够遍历字典并获得具有最高值的键。换句话说,在控制台上打印出现次数最多的号码。在对字典进行排序时,最后一个数字将是最高值

然而,在大多数情况下,可能不止一个数字是并列的,这就是我一直坚持的地方。如果数字4、5、6、7出现的次数最多,我希望能够将其打印到控制台

      Dictionary<int, int> dic = new Dictionary<int, int>();
      //iterates through numbers 0-15
      for (int y = 0; y <= 15; y++)
       {   
            int m = 0;
            //iterates through entire array
            for (int i = 0; i < Arr.Length; i++)
            { 
                //comparisons 
                if (y == Arr[i])
                {
                    m++;

                }

            }
            //Inserts number and count into the dictionary
            dic.Add(y,m);

        }
        //Sorts the dictionary and adds the sorted one into a new dictionary
        Dictionary<int, int> dic2 = new Dictionary<int, int>();
        foreach (KeyValuePair<int, int> value in dic.OrderBy(key => key.Value))
        {
            Console.WriteLine("{0} appears {1} times ", value.Key, value.Value);
            dic2.Add(value.Key, value.Value);
        }

        //Finds the keys with most common occurance
        KeyValuePair<int, int> e = dic2.Last();

        foreach (KeyValuePair<int, int> comp in dic2)
        {

            if (dic.Last() == dic[comp])
                {
                    //something goes here
                    Console.WriteLine("Most common number is {0}", e.Key);
                }
        }

我不确定是否要使用索引来使用键进行比较,或者是否有其他方法来进行比较,就像我在上面尝试的那样,使用foreach循环

您可以使用linq查询来查找每个键的眼相关数并对其进行计数。之后,返回一个带有Key和total的anon对象,对于示例:

var q = from k in dic
        let t = dic.Count(x => x.Value == k.Key)
        select new { Key = k.Key, Total = t };

var max = q.OrderByDescending(x => Total).First();

Console.WriteLine("Most common number is {0} with {1} ocurrencies", max.Key, max.Total);

老实说,我根本不会使用当前的方法——你做的工作比你需要做的多得多。LINQ为您提供了比这更好的工具。您可以使用GroupBy使其更干净:

var pairs = array.GroupBy(x => x)
                 .Select(g => new { Key = g.Key, Count = g.Count() }
                 .OrderByDescending(pair => pair.Count)
                 .ToList();
这将获得所有的键/计数对,最常见的是第一对。然后,显示部分应该相当简单,例如

// Note: this relies on the initial array being non-empty
var highestCount = pairs.First().Count;
foreach (var pair in pairs.TakeWhile(pair => pair.Count == highestCount))
{
    Console.WriteLine("{0}: {1}", pair.Key, pair.Count);
}

为了清楚起见,上面的代码将替换问题中的所有代码。您根本不需要字典。

您似乎假设字典维持您添加项目的顺序。这并不能保证,即使在当前的实现中,如果您不删除任何项,可能会发生这种情况。你不应该依赖字典的顺序。@JonSkeet那么什么是更好的选择呢?考虑到字典的部分,Felipe的方法对我来说似乎是合理的。。。但坦率地说,目前这一切都太过分了。将添加一个答案。