4

我有一个List<>N 项。当且仅当 N = 1 时,我想获得第一个元素。这可以使用lambda或其他一些不错的构造来完成吗?

这有效,但看起来很可怕:

var blah = new List<Object>() { new Object() };
var item = (blah.Count == 1 ? blah[0] : null);
4

5 回答 5

7

有几种 LINQ 扩展方法。

  1. SingleOrDefault 如果有一个元素则返回,如果没有default<T>则返回,如果有多个则抛出异常
  2. FirstOrDefault 如果有一个元素,则返回,如果没有,则default<T>返回
  3. ElementAtOrDefault 返回给定位置的元素,或者default<T>如果序列没有那么多元素

因此,例如(我更喜欢您的要求):

var item = blah.ElementAtOrDefault(0);

满足您要求的最佳方法取决于此规则的严格程度:

当且仅当 N = 1 时,我想获得第一个元素。

如果序列中有多个元素是异常SingleOrDefault的,请使用它,如果它失控,您将被告知(错误日志)。

如果获得第一个元素很重要,并且您永远不会想要另一个元素,那么使用更好,FirstOrDefault因为它有一个有意义的名称。

如果序列中元素的索引很重要并且您(当前)需要第一个元素,但将来可能会改变,请使用ElementAtOrDefault.

于 2012-07-12T08:31:53.427 回答
4

您可以为它编写自己的扩展方法

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();
于 2012-07-12T08:31:22.367 回答
1

我认为 SingleOrDefault 是您正在寻找的:

using System.Linq;    
...
var item = blah.SingleOrDefault();
于 2012-07-12T08:27:02.020 回答
0

它看起来并没有好多少,但您可以使用blah.Single()代替blah[0]

var blah = new List<Object>() { new Object() };
var item = blah.Count == 1 ? blah.Single() : null;
于 2012-07-12T08:28:32.047 回答
0

如果你有 :

var blah = new List<MyClass>() { new MyClass() };

你可以这样做 :

var item = (blah.Count == 1 ? blah[0].Single<MyClass>() : null);
于 2012-07-12T08:30:26.963 回答