Значение 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? если AsEnumerable не существует в.NET Framework, то каков будет подход разработчиков для выполнения вышеуказанной задачи?

2 ответа

Решение

Предполагая, что я правильно интерпретирую, это вызывает DataTableExtensions.AsEnumerable(), Без этого (или чего-то подобного) вы не можете использовать LINQ to Objects как DataTable не реализует IEnumerable<T>, только IEnumerable,

Обратите внимание, что альтернативой будет использование Cast<DataRow>, но это было бы немного иначе, поскольку это будет использовать DataTable "s GetEnumerator прямо внутри Cast тогда как я верю EnumerableRowCollection<TRow> делает немного более забавные вещи с таблицей данных. Это вряд ли покажет какие-либо реальные изменения, за исключением, возможно, небольшой разницы в производительности.

.AsEnumerable() расширение - это просто сокращение для приведения чего-то, что реализует IEnumerable<T> быть IEnumerable<T>

Так что если xs является int[], ты можешь позвонить xs.AsEnumerable() вместо (xs as IEnumerable<int>), Он использует вывод типа, чтобы избежать необходимости явно указывать тип xs,

Вот код, извлеченный Reflector.NET:

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

Но в этом случае я думаю, что должен согласиться с Джоном. Это, вероятно, из System.Data.DataSetExtensions сборка.

Другие вопросы по тегам