0
Dictionary<objectx,objecty> d.

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

d.GroupBy(t => t.Value) 

给了我结果,我无法从中获取值。

谢谢

4

4 回答 4

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

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

于 2012-07-18T13:26:55.857 回答
1

你已经成功了。现在您已经有了这些组,您可以使用MoreLinqMaxBy中的方法来识别具有最高计数的值。

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

MaxBy的实现让您深入了解如何自己实现这一点(确保承认版权/许可)。

于 2012-07-18T13:24:21.233 回答
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 来做到这一点,但如果 List 中有很多元素,我认为 OrderBy 是重型扩展功能。我希望这会有所帮助。

于 2012-07-18T14:03:24.500 回答
0

或者,如果您真的只关心哪个发生最多(而不是他们拥有哪些键),请忽略它是 aDictionary并仅对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

编辑:我喜欢不使用第二个转换。谢谢,@蒂姆。更改了我的并删除了对不再在他的帖子中的内容的引用。

于 2012-07-18T13:53:47.237 回答