72 c# ienumerable singleton empty-list
在C#中,我使用LINQ和IEnumerable一点点.一切都很好(或至少大部分都是如此).
但是,在很多情况下,我发现自己需要一个空IEnumerable<X>的默认值.也就是说,我想
for (var x in xs) { ... }
Run Code Online (Sandbox Code Playgroud)
无需空检查即可工作.现在这是我目前所做的,取决于更大的背景:
var xs = f() ?? new X[0]; // when xs is assigned, sometimes
for (var x in xs ?? new X[0]) { ... } // inline, sometimes
Run Code Online (Sandbox Code Playgroud)
现在,虽然上面对我来说完全没问题 - 也就是说,如果创建数组对象有任何"额外开销"我只是不在乎 - 我想知道:
在C#/ .NET中是否存在"空的不可变IEnumerable/IList"单例?(而且,即使没有,是否有一种"更好"的方式来处理上述情况?)
Java具有Collections.EMPTY_LIST不可变的单例 - "良好类型"的通道Collections.emptyList<T>()- 用于此目的,虽然我不确定类似的概念是否甚至可以在C#中工作,因为泛型的处理方式不同.
谢谢.
Sti*_*gar 89
你在找 Enumerable.Empty<int>();
在其他新闻中,Java空列表很糟糕,因为List接口公开了向列表添加元素的方法,这些方法会抛出异常.
Jon*_*Jon 51
Enumerable.Empty<T>() 就是这样.
And*_*lon 10
我认为添加扩展方法是一个干净的选择,因为它们能够处理空值 - 如下所示:
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> list)
{
return list ?? Enumerable.Empty<T>();
}
foreach(var x in xs.EmptyIfNull())
{
...
}
Run Code Online (Sandbox Code Playgroud)
在原始示例中,您使用一个空数组来提供一个空的可枚举值。虽然使用Enumerable.Empty<T>()是完全正确的,但可能还有其他情况:如果必须使用数组(或IList<T>接口),则可以使用方法
System.Array.Empty<T>()
Run Code Online (Sandbox Code Playgroud)
这可以帮助您避免不必要的分配。
注释/参考:
| 归档时间: |
|
| 查看次数: |
31997 次 |
| 最近记录: |