Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表上的max KeyValuePair<;KeyValuePair>;_C#_Linq_List_Max - Fatal编程技术网

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
谁拥有max
Key

但是,我想得到密钥的值。不仅是钥匙

我能够做到这一点:

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);