1

次の疑似C#コードを使用します。

using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;

public IEnumerable<IDataRecord> GetRecords(string sql)
{
     // DB logic goes here
}

public IEnumerable<IEmployer> Employers()
{
     string sql = "select EmployerID from employer";
     var ids = GetRecords(sql).Select(record => (record["EmployerID"] as int?) ?? 0);
     return ids.Select(employerID => new Employer(employerID) as IEmployer);
}

2つのSelect()呼び出しを組み合わせると、より速くなりますか?上記のコードに余分な反復がありますか?次のコードは速いですか?

public IEnumerable<IEmployer> Employers()
{
     string sql = "select EmployerID from employer";
     return GetRecords(sql).Select(record => new Employer((record["EmployerID"] as int?) ?? 0) as IEmployer);
}

パフォーマンスに違いがなければ、最初の例の方が読みやすいと思います。

4

2 に答える 2

2

大きな違いはありません。どちらのメソッドも、GetRecordsからの結果をループできる式を返します。

最初のものはSelectsをチェーンしているため、これらは同一ではありませんが、同じ作業を同じ順序で実行します。チェーンされた選択をループする場合、2番目の選択は必要に応じて最初の選択から1つと1つのアイテムを配置します。最初の選択は、2番目の選択が結果を使用する前に完了する必要はありません。

于 2010-05-04T05:36:57.637 に答える
0

違いはありません。

LINQは、遅延評価、ソースのアイデアを使用します。関連する部分を引用します:

これを回避するために、すべての組み込みLINQプロバイダーは、遅延実行と呼ばれる概念を利用しています。クエリ演算子をすぐに実行するのではなく、すべてIEnumerable(of T)インターフェイスを実装する型を返すだけです。これらのタイプは、クエリがforeachループで実際に使用されるまで実行を遅らせます。

基本的にEmployers()foreachまたは.ToList()などの結果を使用するまで、実際には何も実行されていません。

于 2010-05-04T05:18:30.463 に答える