LINQ to Data: интеллектуальное распознавание типов

Работая над задачами по математике, я очень люблю LINQ to Data.

Я хотел бы знать, достаточно ли умен LINQ, чтобы избежать приведения типа .ToArray(), когда IEnumerable, с которым я работаю, уже является массивом. См. пример ниже:

/// <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());
}

Избегает ли LINQ преобразования в массив, когда IEnumerable<TimeSerieInfo> timeSeries уже является массивом?

Спасибо за помощь.


person Matthieu Durut    schedule 16.02.2009    source источник
comment
Вы имеете в виду LINQ to Objects или есть какой-то другой поставщик LINQ, называемый LINQ to Data?   -  person Jon Skeet    schedule 16.02.2009


Ответы (3)


LINQ создает копию массива, и это правильное поведение IMO. Было бы очень сложно, если бы вызов ToArray() и последующее изменение возвращаемого массива иногда изменяло исходную коллекцию, а иногда — нет.

person Jon Skeet    schedule 16.02.2009
comment
Это логика. Большое спасибо - person Matthieu Durut; 17.02.2009

Я подозреваю, что он сделает то, что вы просите, и создаст новый массив. Не могли бы вы изменить свой конструктор ModelData, чтобы вместо этого взять IEnumerable?

person Jeff Yates    schedule 16.02.2009

LINQ создает копию массива; он создает System.Linq.Buffer<T>, который создает копию массива.

Однако вы можете создать свой собственный метод расширения:

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