C# 获取列表上的max KeyValuePair<;KeyValuePair>;
我有一个C# 获取列表上的max KeyValuePair<;KeyValuePair>;,c#,linq,list,max,C#,Linq,List,Max,我有一个列表。 我想知道KeyValuePair谁拥有maxKey 但是,我想得到密钥的值。不仅是钥匙 我能够做到这一点: int myValue = myListe.Max(t => t.Key); 但它返回键…而不是值:( 我怎样才能做到这一点?最简单(但不必要的昂贵)的方法是: var pair = myList.OrderByDescending(x => x.Key).First(); 但是,编写一个定制的MaxBy扩展方法非常容易,它可以完成相同的工作,而不需要对所
列表
。
我想知道KeyValuePair
谁拥有maxKey
但是,我想得到密钥的值。不仅是钥匙
我能够做到这一点:
int myValue = myListe.Max(t => t.Key);
但它返回键…而不是值:(
我怎样才能做到这一点?最简单(但不必要的昂贵)的方法是:
var pair = myList.OrderByDescending(x => x.Key).First();
但是,编写一个定制的MaxBy
扩展方法非常容易,它可以完成相同的工作,而不需要对所有其他值进行排序。这是否重要取决于列表的大小和您的性能要求
有,这将允许:
var pair = myList.MaxBy(x => x.Key);
您可以使用
First或default
或First
选择所需的KeyValuePair
,以及Max
因此,您可以这样编写代码:
var list = new List<KeyValuePair<int, string>>();
list.Add(new KeyValuePair<int, string>(1, "a"));
list.Add(new KeyValuePair<int, string>(5, "b"));
list.Add(new KeyValuePair<int, string>(3, "c"));
var value = list.FirstOrDefault(x => x.Key == list.Max(y => y.Key));
var list=newlist();
添加(新的KeyValuePair(1,“a”);
添加(新的KeyValuePair(5,“b”);
添加(新的KeyValuePair(3,“c”);
var值=list.FirstOrDefault(x=>x.Key==list.Max(y=>y.Key));
为了完整起见,在这种情况下,另一种有效的方法是使用以下方法:
var item=myList.Aggregate((a,b)=>a.Key
查看库中的MaxBy
。是否有重复的键?否则使用SortedDictionary
可能会有所帮助。查看“聚合”,例如:myListe.Aggregate((l,r)=>l.Value>r.Value?l:r).Key;刚刚对照@Marc建议的解决方案检查了这种方法的性能。对于10000个元素,这一个需要2.23秒,而另一个需要0.0055秒。我对这样的差异感到惊讶。@3615 10000不可能需要2.23秒-我想你是在考虑JIT成本或其他问题;我怀疑测试有问题。@MarcGravell你可以看到我用过的代码。@3615啊,是的,那代码确实有问题-上面的答案不好;建议:var-maxVal=list.Max(x=>x.Key);var-res=list.Single(p=>p.Key==maxVal)
-应该更好!另外:关于副本呢?可能需要先而不是单个-基本上:你说的“不必要的昂贵”是什么意思?就编写的代码量或性能而言昂贵?@codroipo performance;OrderBy[降序]
最终是一种排序操作,并且相对昂贵,例如O(n log(n)),而不是单次“maxby”的O(n)
var item = myList.Aggregate((a, b) => a.Key < b.Key ? b : a);