首页 新闻 赞助 找找看

如何更高逼格的使用Linq的Min()方法?

0
悬赏园豆:10 [待解决问题]

下面这段代码会报错:序列不包含任何元素。

void Main()
{
var lst =new List<int>();
var minVal = lst.Min();
Console.WriteLine(minVal);
}

那每次使用.Min的时候,就得必须判断List集合是否有元素了,那这样的代码逼格不高啊,有没有办法可以实现 xxxx.where(p=>p=1).Min() 。这种链式编程下去的方法?

dotnetgeek的主页 dotnetgeek | 菜鸟二级 | 园豆:482
提问于:2016-03-04 17:09
< >
分享
所有回答(8)
0

var minVal = lst.Count() > 0 ? lst.Min() : 0;

你权权是纠结逼格?

Rich.T | 园豆:3440 (老鸟四级) | 2016-03-04 17:22

回复完才看到你的....英雄所见略同

支持(0) 反对(0) 有道之士 | 园豆:204 (菜鸟二级) | 2016-03-04 17:23

@有道之士: 有代码洁癖

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2016-03-04 17:24

你这样子做,还是要从一个大的数据集合过滤之后,再进行可空的判断的。

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2016-03-04 22:07
0

var minVal = (lst.Count > 0)?lst.Min():null;

有道之士 | 园豆:204 (菜鸟二级) | 2016-03-04 17:22
0

研究研究扩展方法嘛

刘宏玺 | 园豆:14020 (专家六级) | 2016-03-04 17:32
0

你集合没元素了,你要Min返回什么?

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-04 17:52

但是过滤之前,我不知道有没有元素的啊。所以,我觉得应该要实现一个扩展方法,如果没有元素,则返回默认值。

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2016-03-04 22:08

@dotnetgeek: 

public static class Bigger
{
    public static T GaoBiggerMin<T>(this IEnumerable<T> target,T defaultValue)
    where T:IComparable<T>
    {
        if(target==null)
            return defaultValue;
        
        var source=target.ToList();
        if(source.Count==0)
            return defaultValue;
        
        var retValue=source[0];
        for(int i=1;i<source.Count;i++)
        {
            retValue=retValue.CompareTo(source[i])>0?source[i]:retValue;
        }
        return retValue;
    }
}
支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-03-07 09:13
0

自己写个Min扩展啊

jello chen | 园豆:7306 (大侠五级) | 2016-03-04 22:06

有理。

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2016-03-04 22:08
0

var lst =new List<int>();
var minVal = lst.Any()?lst.Min():0;  //如果为序列不存在任何元素,就返回默认值0
Console.WriteLine(minVal);

Any方法能用于任何一个泛型序列(IEnumerable<T>),其内部使用迭代器尝试获取下一个元素,如果能获取到马上返回true,反之返回false,无需遍历整个序列。下面是反编译Any方法的代码:

 

 1 public static bool Any<TSource>(this IEnumerable<TSource> source)
 2 {
 3     if (source == null)
 4     {
 5         throw Error.ArgumentNull("source");
 6     }
 7     using (IEnumerator<TSource> enumerator = source.GetEnumerator())
 8     {
 9         if (enumerator.MoveNext())
10         {
11             return true;
12         }
13     }
14     return false;
15 }

 

 

 

编程小菜鸭 | 园豆:170 (初学一级) | 2016-03-04 23:16
0

还能咋写,自己二次扩展一下。要么还是老老实实先判断吧。

幻天芒 | 园豆:37175 (高人七级) | 2016-03-05 09:54
0

这样写呗:

var minVal = lst.Min(i => (int?) i);

这样空集合的时候就返回null了。

 

或者空集合的时候你要数字的话

var minVal = lst.Min(i => (int?) i) ?? 0;

 

另外,如果要效率的话,是不能先取Count()的,

var minVal = lst.IsEmpty() ? 0 : lst.Min();
天方 | 园豆:5407 (大侠五级) | 2016-03-09 01:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册