AsEnumerable的意义?

时间:2011-09-29 10:52:09

标签: c# .net generics asenumerable

var query = 
    from dt1 in dtStudent.AsEnumerable()
    join dt2 in dtMarks.AsEnumerable()
        on dt1.Field<int>("StudentID")
        equals dt2.Field<int>("StudentID")
    select new StudentMark
    {
        StudentName = dt1.Field<string>("StudentName"),
        Mark = dt2.Field<int>("Mark")
    };

在上面的编码中,AsEnumerable的意义是什么?如果.NET Framework中不存在AsEnumerable,那么开发人员执行上述任务的方法是什么?

2 个答案:

答案 0 :(得分:3)

假设我正确地解释它,它正在调用DataTableExtensions.AsEnumerable()。没有它(或类似的东西),你不能使用LINQ to Objects,因为DataTable没有实现IEnumerable<T>,只有IEnumerable

请注意,另一种方法是使用Cast<DataRow>,但这会略有不同,因为DataTable直接使用GetEnumerator的{​​{1}},而我Cast相信EnumerableRowCollection<TRow>使用数据表做一些更时髦的事情。它不太可能出现任何真正的变化,除了可能会有轻微的性能差异。

答案 1 :(得分:1)

.AsEnumerable()扩展程序只是简单地将实现IEnumerable<T>的内容转换为IEnumerable<T>

因此,如果xsint[],则可以拨打xs.AsEnumerable()而不是(xs as IEnumerable<int>)。它使用类型推断来避免需要明确键入xs的类型。

这是Reflector.NET提取的代码:

public static IEnumerable<TSource> AsEnumerable<TSource>(
    this IEnumerable<TSource> source)
{
    return source;
}

但在这种情况下,我想我必须同意乔恩。它可能来自System.Data.DataSetExtensions汇编。