我有List<>
个N项。我想得到第一个元素当且仅当N = 1.这可以使用lambda
或其他一些好的构造来完成吗?
这很有效,但看起来很可怕:
var blah = new List<Object>() { new Object() };
var item = (blah.Count == 1 ? blah[0] : null);
答案 0 :(得分:7)
有几种LINQ扩展方法。
SingleOrDefault
如果有一个元素将被返回,如果没有,将返回default<T>
,如果有多个异常被抛出FirstOrDefault
如果有一个元素将被返回,如果没有,将返回default<T>
ElementAtOrDefault
返回给定位置的元素,如果序列没有那么多元素,则返回default<T>
所以例如(我的首选你的要求):
var item = blah.ElementAtOrDefault(0);
满足您要求的最佳方法取决于此规则的严格程度:
当且仅当N = 1时,我想得到第一个元素。
如果序列中有多个元素例外,请使用SingleOrDefault
,如果它失控,您将收到通知(错误日志)。
如果您获得第一个元素并且您永远不会想要其他元素,那么请使用更好的FirstOrDefault
因为它有一个有意义的名称。
如果序列中元素的索引很重要且您(当前)需要第一个元素,但将来可能会更改,请使用ElementAtOrDefault
。
答案 1 :(得分:4)
您可以为它编写自己的extension method:
public static class ListExtensions
{
public static T SingleOrNothing<T>(this IList<T> list) where T : class
{
if (list.Count == 1)
return list.Single();
else
return null;
}
}
然后你只需在你的代码中调用它:
var item = someList.SingleOrNothing();
答案 2 :(得分:1)
我认为SingleOrDefault正是您所寻找的:
using System.Linq;
...
var item = blah.SingleOrDefault();
答案 3 :(得分:0)
看起来效果不是很好,但您可以使用blah.Single()
代替blah[0]
:
var blah = new List<Object>() { new Object() };
var item = blah.Count == 1 ? blah.Single() : null;
答案 4 :(得分:0)
如果你有:
var blah = new List<MyClass>() { new MyClass() };
你可以这样做:
var item = (blah.Count == 1 ? blah[0].Single<MyClass>() : null);