Enumerable.Empty to List

Mar*_*tin 4 c#

例如,如果我有这个方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

在调用方法中我做:

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;
}
Run Code Online (Sandbox Code Playgroud)

当生成失败时,我得到一个异常"[NotSupportedException:Collection是固定大小的.]".

这是因为Enumerable empty是一个IList,因此.ToList()没有运行,然后我尝试添加到一个固定的Enumberable.Empty.我错误地认为这是一个糟糕的设计,一个继承IList的对象(其中定义了Add)应该支持Add?

我被迫做var randomList = random.ToList()或停止使用Enumberable.Empty?有更好的方法吗?

更新: 我想在我的例子中我不清楚.我希望吞下(或记录)错误,但允许操作继续而不会崩溃.我的评论"我这样做是为了表明我们有错误"是为了告诉其他开发人员阅读代码,这是一种异常行为.

蒂姆所关联的问题的答案就是我所得到的.似乎我们只是没有用于常量集合的接口,因此IList被使用.

Sve*_*ven 5

更好的方法是返回null或抛出异常.返回空列表可以被认为是有效的替代,但不是在您的方法的上下文中(例如,过滤另一个没有有效项目的列表).

失败的随机数生成似乎表明生成算法存在问题,应该抛出异常,而不是空列表.

检索方法是否应返回'null'或在无法生成返回值时抛出异常?

如果您总是希望找到一个值,则抛出异常(如果缺少).例外意味着存在问题.

如果该值可能丢失或存在且两者都对应用程序逻辑有效,则返回null.