我有一个List<>
N 项。当且仅当 N = 1 时,我想获得第一个元素。这可以使用lambda
或其他一些不错的构造来完成吗?
这有效,但看起来很可怕:
var blah = new List<Object>() { new Object() };
var item = (blah.Count == 1 ? blah[0] : null);
有几种 LINQ 扩展方法。
SingleOrDefault
如果有一个元素则返回,如果没有default<T>
则返回,如果有多个则抛出异常FirstOrDefault
如果有一个元素,则返回,如果没有,则default<T>
返回ElementAtOrDefault
返回给定位置的元素,或者default<T>
如果序列没有那么多元素因此,例如(我更喜欢您的要求):
var item = blah.ElementAtOrDefault(0);
满足您要求的最佳方法取决于此规则的严格程度:
当且仅当 N = 1 时,我想获得第一个元素。
如果序列中有多个元素是异常SingleOrDefault
的,请使用它,如果它失控,您将被告知(错误日志)。
如果获得第一个元素很重要,并且您永远不会想要另一个元素,那么使用更好,FirstOrDefault
因为它有一个有意义的名称。
如果序列中元素的索引很重要并且您(当前)需要第一个元素,但将来可能会改变,请使用ElementAtOrDefault
.
您可以为它编写自己的扩展方法:
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();
我认为 SingleOrDefault 是您正在寻找的:
using System.Linq;
...
var item = blah.SingleOrDefault();
它看起来并没有好多少,但您可以使用blah.Single()
代替blah[0]
:
var blah = new List<Object>() { new Object() };
var item = blah.Count == 1 ? blah.Single() : null;
如果你有 :
var blah = new List<MyClass>() { new MyClass() };
你可以这样做 :
var item = (blah.Count == 1 ? blah[0].Single<MyClass>() : null);