簡體   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