簡體   English   中英

Enumerable.Empty 列出

[英]Enumerable.Empty to List

例如,如果我有這個方法:

IEnumerable<int> GetRandomNumbers()
{
    // {Codes that generate numbers as List<int>}
    if(generationFails == true)
    {
        return Enumberable.Empty<int>(); // I do this to signal that we have an error
    }
    return numbers;
}

在調用方法中,我這樣做:

IEnumerable<int> AddNumber(int number)
{
    var random = GetRandomNumbers();
    var randomList = random  as IList<int> ?? random.ToList(); // Run ToList only if needed
    randomList.Add(number); 
    return randomList;
}

當生成失敗時,我收到一個異常“[NotSupportedException: Collection was of a fixed size.]”。

這是因為 Enumerable empty 是一個 IList,所以 .ToList() 沒有運行,然后我試圖添加到一個固定的 Enumberable.Empty。 我認為這是一個糟糕的設計,一個繼承 IList(定義 Add 的地方)的對象應該支持 Add 是否錯誤?

我是被迫做var randomList = random.ToList()還是停止使用Enumberable.Empty 有什么更好的方法嗎?

更新:我想我在我的例子中不清楚。 我希望吞下(或記錄)錯誤,但允許操作繼續而不會崩潰。 我的評論“我這樣做是為了表明我們有錯誤”是為了告訴其他閱讀代碼的開發人員這是一種異常行為。

蒂姆鏈接的問題的答案就是我所得到的。 似乎我們只是沒有常量集合的接口,所以使用了IList

更好的方法是返回null或拋出異常。 返回一個空列表可以被認為是一個有效的替代方案,但不是在您的方法的上下文中(例如,過濾另一個沒有有效項目的列表)。

隨機數生成失敗似乎表明生成算法存在問題,應該拋出異常,而不是空列表。

當檢索方法無法產生返回值時,它應該返回“null”還是拋出異常?

如果您總是希望找到一個值,則在它丟失時拋出異常。 異常將意味着存在問題。

如果該值可能缺失或存在,並且兩者都對應用程序邏輯有效,則返回空值。

實際上Enumerable.Empty 返回一個空數組,這就是你在Array.IList.Add得到NotSupportedExceptionArray.IList.Add 數組具有固定大小。

為什么數組實現 IList?

如果您想“表示存在錯誤”,我將返回null而不是空序列。 就可讀性而言,對您的業務邏輯進行類型檢查並不好。

if(generationFails == true)
{
    return null; // I do this to signal that we have an error
}

然后很簡單:

IEnumerable<int> random = GetRandomNumbers();
IList<int> randomList = random == null ? new List<int>() : random.ToList();

一個空的序列表明一切都很好。 考慮到您將來會更改方法以采用整數size 現在有人提供0作為大小,它也返回一個空序列。 您無法再區分錯誤和空序列。

當然,您也可以返回new List<int>而不是Enumerable.Empty<int>

解決這個問題的另一種可能方法是使用yield break返回一個空的枚舉器:

IEnumerable<int> GetRandomNumbers()
{
    if (generationFails)
        yield break;

    foreach (var element in numbers)
    {
        yield return element;
    }
}

這將使您的IEnumerable<int>懶惰地返回每個隨機數。

請注意,這不會給調用代碼帶來錯誤 如果generationFails應該在代碼執行中發現一個錯誤,那么你絕對應該拋出一個異常,正如其他人所說的那樣。

使用 Enumerable.Empty() 方法,您可以使用緩存數組而不是創建一個新數組。 它可以對性能產生積極影響,因為您的代碼不會經常打擾垃圾收集器。

看看Enumerable.Empty() 與新的 'IEnumerable'() - 哪個更好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM