【问题标题】:LINQ to Data : Clever Type RecognitionLINQ to Data:聪明的类型识别
【发布时间】:2010-10-07 22:20:32
【问题描述】:

处理数学问题,我非常喜欢 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&lt;TimeSerieInfo&gt; timeSeries 已经是一个数组时,LINQ 是否会避免转换为数组?

感谢您的帮助。

【问题讨论】:

  • 您的意思是 LINQ to Objects,还是周围有其他一些称为 LINQ to Data 的 LINQ 提供程序?

标签: c# linq types casting


【解决方案1】:

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

【讨论】:

  • 这就是逻辑。非常感谢
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我怀疑它会按照您的要求创建一个新数组。你能不能把ModelData的构造函数改成IEnumerable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多