所以我想问:为什么我们只有返回可枚举的选择器?例如,我经常遇到必须修改数组的每个值的情况,例如:
int[] a = {1,2,3,4,5};
a = a.Select(x=>x*2).ToArray();
所以在这里我们得到一个可枚举的,只有在它之后我们才能将它转换回数组。我们可以尝试使用 Array.ForEach,但前提是我们可以修改源。但是如果我们有引用类型的数组并且不能修改它们,我们无论如何都应该写这样的东西
SomeClass[] a = FillSomeClassArray();
SomeClass[] b = a.Select(x=> ((SomeClass)x.Clone()).Modify()).ToArray();
就我而言,我正在使用我自己的课程
public static class CollectionHelper
{
public static TResult[] SelectToArray<T, TResult>(this ICollection<T> source, Func<T, TResult> selector)
{
if (source == null)
throw new ArgumentNullException("source");
if (selector == null)
throw new ArgumentNullException("selector");
var result = new TResult[source.Count];
int i = 0;
foreach (T t in source)
{
result[i] = selector(t);
i++;
}
return result;
}
}
这里我们没有双重转换,当我们没有谓词时,我们知道结果的长度,我们应该使用这个信息。我知道 MS 不应该代替我做所有的工作,但是 afaik 它的功能标准已经足够了。