如果只有一个元素,将List <t>转换为T项?</t>

时间:2012-07-12 08:23:31

标签: c# lambda

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

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

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

5 个答案:

答案 0 :(得分:7)

有几种LINQ扩展方法。

  1. SingleOrDefault  如果有一个元素将被返回,如果没有,将返回default<T>,如果有多个异常被抛出
  2. FirstOrDefault  如果有一个元素将被返回,如果没有,将返回default<T>
  3. ElementAtOrDefault 返回给定位置的元素,如果序列没有那么多元素,则返回default<T>
  4. 所以例如(我的首选你的要求):

    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);