我想獲得 a 中最高值的鍵dictionary {'a' : 1, 'b' : 2, 'c' : 2}。在這種情況下,我希望它回傳'b'但使用
weight.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
回傳最后一個最大值,即'c'。
- 有沒有辦法回傳我的字典中第一個最大值的鍵?=>
'b' - 另外,是否可以回傳最大系結值的鍵陣列?=>
new char[]{'b', 'c'} - 我應該改用哪種鍵值資料結構?
編輯:由于它在評論中引起了不小的轟動,我的意思是插入順序方面的第一個最大值。
uj5u.com熱心網友回復:
(為了提出建議)
受此答案的啟發,我將建議一種方法,您可以創建自己的繼承自的型別List<KeyValuePair<char, int>>(從而保留插入順序),并base.Add()使用確保僅將具有唯一keys 的條目添加到串列中的方法隱藏該方法。
如果您可以逐個添加專案,并且如果將專案添加到串列是您打算更改串列內容的唯一方法,那么這非常適合您的特定用例。如果您可能需要從串列中洗掉專案,則需要擴展實施以涵蓋該內容。
另外值得一提的是:此實作允許嘗試將具有非唯一鍵的條目添加到串列中的事件靜默通過。沒有尖叫;根本沒有添加條目。
執行:
public class UniqueKeyKvpList : List<KeyValuePair<char, int>>
{
private readonly HashSet<char> _keys = new HashSet<char>();
// Hiding base method List<KeyValuePair<char, int>>.Add()
public new void Add(KeyValuePair<char, int> kvp) => Add(kvp.Key, kvp.Value);
// Simpler .Add() method; imitates Dictionary.Add() in usage
public void Add(char key, int value) => AddIfUniqueKey(key, value);
private void AddIfUniqueKey(char key, int value)
{
if (!_keys.Contains(key))
{
_keys.Add(key);
base.Add(new KeyValuePair<char, int>(key, value));
}
}
}
用法:
var myKvpList = new UniqueKeyKvpList();
myKvpList.Add('a', 1);
myKvpList.Add('a', 2); // will not be added (duplicate key)
myKvpList.Add('b', 3);
填充串列后,您可以獲得最大值的所有字符,如下所示:
.Net 6(由于使用.MaxBy())
char[] charsWithMaxValue = myKvpList
.GroupBy(kvp => kvp.Value)
.MaxBy(gr => gr.Key) // Group key is the kvp value
.Select(kvp => kvp.Key)
.ToArray();
< .Net 6
char[] charsWithMaxValue = myKvpList
.GroupBy(kvp => kvp.Value)
.OrderByDescending(gr => gr.Key) // Group key is the kvp value
.First()
.Select(kvp => kvp.Key)
.ToArray();
具有最大值的第一個字符將是
char firstCharWithMaxValue = charsWithMaxValue.First();
或者,如果charsWithMaxValue什么都不需要計算,firstCharWithMaxValue可以直接計算如下:
.Net 6
char firstCharWithMaxValue = myKvpList
.MaxBy(kvp => kvp.Value)
.Key;
< .Net 6
char firstCharWithMaxValue = myKvpList
.OrderByDescending(kvp => kvp.Value)
.First()
.Key;
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429018.html
