繁体   English   中英

为什么System.Linq.Enumerable中没有SelectToArray方法

[英]Why there is no SelectToArray method in System.Linq.Enumerable

所以我想问:为什么我们只有选择器返回一个可枚举的? 例如,我经常遇到必须修改数组的每个值的情况,例如:

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足以满足其功能标准。

SelectToArray添加到框架的最大问题是一致性。 如果添加SelectToArray ,则还应添加以下各项:

  • CastToArray<T>
  • ConcatToArray<T>
  • RepeatToArray<T>
  • ReverseToArray<T>
  • SkipToArray<T>
  • OfTypeToArray<T>
  • TakeToArray<T>

当我们讨论添加新方法的主题时,向列表添加相同的优化又有什么问题呢? 现在我们还需要

  • SelectToList<T> (类似于开始全部操作的那个)
  • CastToList<T>
  • ConcatToList<T>
  • ...依此类推-我确定您有这个主意。

考虑到通过了解目标阵列或目标列表的大小而节省的成本很小,因此这种重大重构是不切实际的。 您可以使用以下简单方法实现相同的效果:

static T[] CopyToArray(
    this IEnumerable<T> source
,   T[] result
,   int pos = 0
,   int? lengthOrNull = null
) {
    int length = lengthOrNull ?? result.Length;
    foreach (var item in source) {
        if (pos > length) break;
        result[pos++] = item;
    }
    return result;
}

现在,调用者可以将现有的LINQ功能与该方法结合起来,以构成上述所有XyzToArray方法,如下所示:

IList<MyClass> data = ...
int[] res = data.Select(x => x.IntProperty).CopyToArray(new int[data.Count]);

您还可以将LINQ查询的结果写入现有数组的不同部分,如下所示:

IList<MyClass> data1 = ...
IList<MyClass> data2 = ...
int[] res = new int[data1.Count+data2.Count];
data1.Select(x => x.IntProperty).CopyToArray(res, 0, data1.Count);
data2.Select(x => x.IntProperty).CopyToArray(res, data1.Count, data2.Count);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM