使用linq选择最小值

时间:2012-03-06 18:22:45

标签: c# linq

我有一个词典

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值选择一个键呢?

4 个答案:

答案 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);
}