5

我安全地在列表中搜索这样的对象:

var someResult = myList.FirstOrDefault(x=>x.SomeValue == "SomethingHere");

如果没有符合我的条件的对象,那么someResult它将为空。

但是如果我只有我想要的对象的索引,事情就不那么好了。我似乎不得不这样:

try
{
    var someResult = myList[4];
}
catch (ArgumentOutOfRangeException)
{
    someResult = null;
}

我承认不得不写并不可怕。但在我看来,如果索引最终是虚假的,应该有一种方法让列表返回 null。

是否可以使用现有的 .net 方法查找一(或两)行?

(我知道我可以轻松编写扩展方法,但我想知道是否有内置方法可以做到这一点。)

4

4 回答 4

11

我想你想要CB的建议ElementAtOrDefault- 去投票吧。

我还有几点要补充...

关于您的尝试/捕获解决方案:

我承认不得不写并不可怕。

不要为此使用例外。你的方法更冗长,异常很慢,所以你会得到很差的性能,异常应该只用于异常情况。


通过使用条件运算符,在没有 LINQ 的情况下编写它也相当容易:

var someResult = myList.Count > 4 ? myList[4] : null;
于 2012-07-10T21:40:18.580 回答
10

您可以使用 LINQ 扩展 .ElementAtOrDefault() 来实现您想要的。

List<Foo> foos = new List<Foo>();
Foo element = foos.ElementAtOrDefault(4);

但是,您需要注意您的泛型类型List<T>是引用类型或字符串,因此返回给您的“默认”实际上是 null。您返回的默认值是 default(T)。

于 2012-07-10T21:58:00.083 回答
3

是的,当您只有索引时,您也可以使用 LINQ:

var someResult = myList
            .Select((x, i) => new { X = x, Index = i })
            .FirstOrDefault(x => x.Index == 4);

Enumerable.Select 方法 (IEnumerable, Func)

通过合并元素的索引将序列的每个元素投影到新形式中。

于 2012-07-10T21:41:45.727 回答
2

C B的答案赢了,但我可以争夺第二名,对吧?

var someResult = myList.Skip(4).FirstOrDefault();
于 2012-07-10T22:24:44.397 回答