1

对于这样的代码,“物化”是一个好名字,还是有更好的(和官方的)名字?

enumerable as ICollection<T> ?? enumerable .ToArray()

编辑:我澄清了代码(及其目的)

// or "MaterializeIfNecessary"
public static IEnumerable<T> Materialize<T>(this IEnumerable<T> source)
{
    // if you use code analysis tools like resharper, you may have to return a 
    // different type to turn off warnings - even a placeholder interface like 
    // IMaterializedEnumerable<T> : IEnumerable<T> { } 

    if (source == null) return null;

    return source as ICollection<T> ?? source.ToArray();
}

问题:

static void Save(IEnumerable<string> strings)
{
    // The following code is Resharper suggested solution to 
    // "Possible multiple enumeration of IEnumerable" warning
    // ( http://confluence.jetbrains.com/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable ):
    strings = strings as string[] ?? strings.ToArray(); // you're not calling 
                                                        // ToArray because you 
                                                        // need an array, here

    if (strings.Any(s => s.Length >= 255)) throw new ArgumentException();

    File.AppendAllLines("my.path.txt", strings);
}

使用扩展方法,第一行应该更具声明性:

strings = strings.MaterializeIfNecessary();
4

2 回答 2

1

我会调用它ToReadOnlyCollection。它提供了有关该函数实际在做什么的更多信息。
至于物化源,它似乎只有在ToArray()被调用时才会这样做。(仅包装源不会实现它)

于 2013-02-11T20:23:13.800 回答
1

正如@Magnus 已经建议的那样,ToReadOnlyCollection这是您方法的一个很好的描述性名称。我也觉得AsReadOnlyCollection这个名字不太好。通常AsXXX方法不会隐藏或包装源。此类方法只是将 source 作为已由 source 实现的接口之一返回。您可以使用这种方法而不是强制转换。

并且Materialize完全没有说明方法的意图。这是什么意思?我将能够用手触摸我的序列吗?会印在纸上吗?保存到文件?

是的,我也不明白为什么你需要将IEnumerable已经只读的文件转换为ReadOnlyCollection.

于 2013-02-11T20:29:01.527 回答