"实现"像这样的代码的好名字,还是有更好的(和官方的)?
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();
答案 0 :(得分:1)
我称之为ToReadOnlyCollection
。它提供了有关函数实际执行操作的更多信息。
至于物化源,它似乎只有在调用ToArray()
时才这样做。 (仅包装源不会实现它)
答案 1 :(得分:1)
正如@Magnus已经建议的那样,ToReadOnlyCollection
是一个很好的描述性名称。我认为AsReadOnlyCollection
并不是一个好名字。通常AsXXX
方法不会隐藏或包装源。这些方法只是将源返回为源已经实现的接口之一。您可以使用此类方法代替转换。
并且Materialize
完全没有告诉方法的意图。这是什么意思?我能用手触摸我的序列吗?它会印在纸上吗?保存到文件?
是的,我也不明白为什么你需要将已经只读的IEnumerable
转换为ReadOnlyCollection
。