繁体   English   中英

是否有一种简洁的内置方式来获取不会引发异常的索引的列表项?

[英]Is there a concise built-in way to get a list item by index that is not going to throw an exception?

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

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

如果没有符合我标准的对象,那么someResult将为null。

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

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

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

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

(我知道我可以很容易地编写扩展方法,但我想知道是否有内置方法来执行此操作。)

我想你想要CBsElementAtOrDefault 建议 - 去投票吧。

我还有几点需要补充......

关于您的try / catch解决方案:

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

不要使用例外。 您的方法更冗长,异常缓慢,因此您将获得较差的性能,异常应仅用于特殊情况。


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

var someResult = myList.Count > 4 ? myList[4] : null;

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

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

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

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

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

Enumerable.Select方法(IEnumerable,Func)

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

CB的答案获胜,但我可以争夺第二名,对吗?

var someResult = myList.Skip(4).FirstOrDefault();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM