我有一个词典
Dictionary<Location2D, int> h_scores = new Dictionary<Location2D, int>();
我希望用最小的int值选择Key // which is Location2D
。
我试过
h_scores.Min().Key; // not working
h_scores.OrderBy(x => x.Value).Select(y=> y.Key).Min(); //error At least one object must implement IComparable.
那么如何通过最小的int值选择一个键呢?
答案 0 :(得分:7)
你只需要使用Min的正确重载:
val minKey = h_scores.Min(s => s.Value).Key;
击> <击> 撞击>
<强>更新强>
没注意Min的重载返回值。你肯定在寻找Jon Skeet的morelinq {/ 3}} {/ 3}}
val minKey = h_scores.MinBy(s => s.Value).Key;
答案 1 :(得分:3)
仅仅为了多样性,不需要外部依赖的解决方案(例如MoreLinq)和O(n)相比,OrderBy()
解决方案至少为O(n * log( n))的:
var minKey =
h_scores.Aggregate(h_scores.First(), (min, curr) => curr.Value < min.Value ? curr : min).Key;
答案 2 :(得分:1)
如果您按Value
订购,则第一个将是最小的
h_scores.OrderBy(x => x.Value).First().Select(y=> y.Key);
答案 3 :(得分:1)
我不知道Location2D是什么,但您可以使用以下示例来执行您想要的操作。只是在你的班级而不是字符串。此外,由于不保证值在Dictionary中是唯一的(但可能在您的情况下),您可能希望在键枚举上执行.Single()。
[Test]
public void Test()
{
var dictionary = new Dictionary<string, int>
{
{ "first", 2 },
{ "second", 1 },
{ "third", 3 },
{ "fourth", 1 }
};
int min = dictionary.Values.Min();
IEnumerable<string> keys = dictionary.Keys.Where(key => dictionary[key] == min);
Assert.That(keys.Count(), Is.EqualTo(2));
Assert.That(keys.Contains("second"), Is.True);
Assert.That(keys.Contains("fourth"), Is.True);
}