获取一个 List<KeyValuePair> 中的最大 KeyValuePair

3

我有一个 List<KeyValuePair<int, string>>

我想知道哪个 KeyValuePair<int, string> 具有最大的 Key

但是,我想获取键的值,而不仅仅是键本身。

我能做到这一点:

int myValue  = myListe.Max(t => t.Key);

但它返回的是键名...而不是键值 :(

我该怎么做?


请查看MoreLINQ库中的MaxBy函数。 - Yacoub Massad
你有重复的键吗?否则使用 SortedDictionary<int, string> 可能会有所帮助。 - Thorsten Dittmar
看一下“Aggregate”,例如:myListe.Aggregate((l, r) => l.Value > r.Value ? l : r).Key; - Cyril Iselin
3个回答

5

最简单(但不必要昂贵)的方法是:

var pair = myList.OrderByDescending(x => x.Key).First();

然而,编写一个定制的MaxBy扩展方法非常容易,它可以在不排序所有其他值的情况下执行相同的任务。这是否重要取决于列表的大小和性能要求。 MoreLINQ有一个适合的MaxBy方法,它将允许:
var pair = myList.MaxBy(x => x.Key);

你所说的“不必要昂贵”是指代码量还是性能方面的昂贵? - Matteo Umili
2
@codroipo 性能;OrderBy[Descending] 最终是一个排序操作,相对而言比较昂贵 - 例如 O(n log(n)) - 而单次“maxby”只需要 O(n)。 - Marc Gravell

1
你可以使用 FirstOrDefaultFirst 来选择所需的 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));

刚刚检查了这种方法的性能,与@Marc建议的解决方案进行了比较。在10000个元素上,这个方法需要2.23秒,而另一个方法只需要0.0055秒。我对这样的差异感到惊讶。 - 3615
@3615 没有可能 10000 花费 2.23 秒 - 我认为你正在查看 JIT 成本或其他什么;我怀疑测试存在问题。 - Marc Gravell
@MarcGravell 在这里 你可以看到我使用的代码。 - 3615
1
@3615 啊,是的,那段代码确实有问题 - 上面的答案是错误的;建议:var maxVal = list.Max(x => x.Key); var res = list.Single(p => p.Key == maxVal); - 应该会好得多!另外:如果有重复项怎么办 - 可能需要用 First 而不是 Single - 基本上就是这样:https://dotnetfiddle.net/uv8icw - Marc Gravell

0
为了完整起见,在这种情况下另一种高效的方法是利用Aggregate方法:
var item  = myList.Aggregate((a, b) => a.Key < b.Key ? b : a);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接