IEnumerable <T> null合并扩展

dig*_*All 5 c# ienumerable extension-methods null-coalescing

我经常面临的问题IEnumerable<T>是在通过foreach或LINQ查询迭代之前检查a是否为null,然后我经常会遇到这样的代码:

var myProjection = (myList ?? Enumerable.Empty<T>()).Select(x => x.Foo)...
Run Code Online (Sandbox Code Playgroud)

因此,我想将此扩展方法添加到Extensions类:

public static class MyExtensions 
{
    public static IEnumerable<T> AsEmptyIfNull<T>(this IEnumerable<T> source)
    {
        return source ?? Enumerable.Empty<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来这个代码时,我会立即想到一个小问题,即,考虑到扩展方法的"实例方法方面",它应该仅仅作为一个静态方法来实现,否则这样的东西将完全合法:

IEnumerable<int> list = null;
list.AsEmptyIfNull();
Run Code Online (Sandbox Code Playgroud)

你看到使用它有任何其他缺点吗?
如果大量使用,这种扩展会导致开发人员出现某种不良趋势吗?


奖金问题:

你能建议一个更好的名字吗? :)
(英语不是我的第一语言,那么我在命名方面不太好...)

提前致谢.

mat*_*ieu 7

返回an的方法IEnumerable<T>应该返回一个空的,而不是null.所以你不需要这个.

看到这个问题:返回null或空集合是否更好?

否则,您的代码似乎没问题.

  • 是的,这是真的,但并非总是可以更改代码以获得此结果(例如,在使用API​​时).举一个真实的例子,尝试使用protobuf序列化一个空列表,然后反序列化它:你将得到null :) (2认同)