【发布时间】:2013-11-22 05:51:51
【问题描述】:
所以我想问:为什么我们只有返回可枚举的选择器?例如,我经常遇到的情况,当我必须修改数组的每个值时,例如:
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 不应该代替我做所有的工作,但它的功能标准已经足够了。
【问题讨论】:
-
顺便说一句,有 ToList().ForEach()
-
我想从源中获取一个数组,只调用一个方法。
ToList().ForEach不是更好,那么简单Select.ToArray()等等
标签: c# .net arrays linq collections