LINQ to Data: умное распознавание типов - PullRequest
1 голос
/ 16 февраля 2009

Работая над проблемами математики, я очень люблю 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 уже является массивом?

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

Ответы [ 3 ]

4 голосов
/ 16 февраля 2009

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

2 голосов
/ 16 февраля 2009

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

0 голосов
/ 16 февраля 2009

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

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

public static TSource[] ToArrayPreserved<TSource>(this IEnumerable<TSource> source)
{
    return (source as TSource[]) ??  source.ToArray();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...