Dictionary<objectx,objecty> d.
我想使用LINQ选择“d”中出现最多的对象y。
d.GroupBy(t => t.Value)
给了我结果我无法从中得到价值。
由于
答案 0 :(得分:2)
objecty maxOccurenceValue = d.GroupBy(kv => kv.Value)
.OrderByDescending(g => g.Count())
.First().Key;
请注意,您的对象需要覆盖Equals
和GetHashCode
或实施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是重度扩展函数。我希望这会有所帮助。