试图在C#和LINQ中制作一个单行程序

时间:2015-02-28 18:26:00

标签: c# linq dictionary

我试图在有序字典中找到第一个更大或相等的键(而不是限制)并返回其值。

    public string foo(int limit, Dictionary<int, string> dir)
    {
        int index = dir.Keys.FirstOrDefault(x => x >= limit);
        return index == 0 ? dir[dir.Keys.Max()] : dir[index];
    }

这很有效。但它很丑陋地说:D

您是否知道如何以巧妙,简单和漂亮的方式制作它?也许是神奇的东西?操作员什么都不符合条件?但是怎么样? :d

3 个答案:

答案 0 :(得分:4)

虽然值的类型可以为空,但您可以使用:

return dir.FirstOrDefault(x => x.Key >= limit).Value ??  
       dir.LastOrDefault().Value;

由于KeyValuePair<int, string>是struct(值类型)且string可以为空,因此默认值将返回0的键,其值为null

P.S: 由于您的方法参数,我建议您的词典是普通KeyValuePair词典。

答案 1 :(得分:0)

假设,正如你所说,字典是有序的,那么整个事情可以简化为:

var first = dir.Where(p => p.Key >= limit)
    .Select(p => p.Value).FirstOrDefault() ?? dir.Last().Value

虽然不保证字典的顺序。

答案 2 :(得分:0)

return dir.Keys.Any(k => k >= limit) ? dir.First(x => x.Key >= limit).Value 
                                     : dir[dir.Keys.Max()];