如何选择具有最多外观的字典值

时间:2012-07-18 13:20:00

标签: c# linq

Dictionary<objectx,objecty> d.

我想使用LINQ选择“d”中出现最多的对象y。

d.GroupBy(t => t.Value) 

给了我结果我无法从中得到价值。

由于

4 个答案:

答案 0 :(得分:2)

objecty maxOccurenceValue = d.GroupBy(kv => kv.Value)
                     .OrderByDescending(g => g.Count())
                     .First().Key;

请注意,您的对象需要覆盖EqualsGetHashCode或实施IEqualityComparer<T>

答案 1 :(得分:1)

你在那里的一部分。现在您已拥有这些组,您可以使用MoreLinq中的MaxBy方法来识别具有最高计数的值。

var highestFrequencyValue = d
    .GroupBy(t => t.Value)
    .MaxBy(g => g.Count())
    .Key;

implementation of MaxBy让您了解如何自己实现这一目标(确保承认版权/许可)。

答案 2 :(得分:0)

或者,如果您真的只关心哪一个最常发生(而不是他们拥有哪些键),请忽略它是Dictionary并仅在Value列表中行动。

Dictionary<string, int> dict = new Dictionary<string, int>
{
    {"hi", 3},
    {"there", 3},
    {"you", 4},
    {"have", 5},
    {"a", 5},
    {"nice", 5},
    {"hat", 5},
    {"and", 6}, 
    {"shoes", 6},
};

var result = dict
    .Select(d => d.Value)
    .GroupBy(k => k)
    .OrderByDescending(k => k.Count())
    .First()
    .Key;

Console.WriteLine(result);

// 5

编辑:我不喜欢使用第二个转换。谢谢,@ Tim。改变了我的意见,删除了对他不再发表的内容的引用。

答案 3 :(得分:0)

List<Order> orders=new List<Order>
            {new Order(){State="cali",ID=1},
            new Order(){State="cali",ID=2},
            new Order(){State="nali",ID=3},
            new Order(){State="pali",ID=4},
            new Order(){State="pali",ID=5},
            new Order(){State="cali",ID=3},
        };
        List<Order> gr=null;
        orders.GroupBy(g => g.State).ToList().ForEach(d=>
        {
            if(gr==null)
                gr = d.ToList<Order>();
            else if (gr.Count() < d.Count())
                gr = d.ToList<Order>();

        });
        return gr;

是的,你可以用OrderBy来做,但我认为如果列表中有很多元素,OrderBy是重度扩展函数。我希望这会有所帮助。