LINQ to Data:聪明的类型识别

时间:2009-02-16 18:11:03

标签: c# linq types casting

处理数学问题,我非常喜欢LINQ to Data。

我想知道当我使用的IEnumerable已经是一个数组时,LINQ是否足够智能以避免像.ToArray()这样的转换。 见下面的例子:

/// <summary> Transforms an array of timeSeries into one ModelData. </summary>
public static ModelData ToModelData(this IEnumerable<TimeSerieInfo> timeSeries)
{
    var seriesArray = timeSeries as TimeSerieInfo[];
    return null != seriesArray ? 
        new ModelData(seriesArray) : 
        new ModelData(timeSeries.ToArray());
}

IEnumerable<TimeSerieInfo> timeSeries已经是数组时,LINQ是否避免转换为数组?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

LINQ创建数组的副本,这是正确的行为 IMO。如果调用ToArray()然后修改返回的数组有时修改了原始集合而有时没有修改它将会非常混乱。

答案 1 :(得分:2)

我怀疑它会按你的要求做,并创建一个新数组。您是否可以更改ModelData的构造函数来取代IEnumerable

答案 2 :(得分:0)

LINQ确实创建了数组的副本;它会创建一个System.Linq.Buffer<T>,它会创建一个数组副本。

您可以创建自己的扩展方法:

public static TSource[] ToArrayPreserved<TSource>(this IEnumerable<TSource> source)
{
    return (source as TSource[]) ??  source.ToArray();
}