1

これはちょっと理論的な質問です。私は他の誰かのコード (以下) を見ていて、私の簡単な解決策は linq の外でコレクションをインスタンス化することでしたが、クエリ内のオブジェクトをインスタンス化したい場合があると推測できます。そしておそらく要素の選択についてのみ。これがどのように行われていたか (悪いこと) の簡単な例を次に示します。

var pods = (from n in ids
where new Node(Convert.ToInt32(n)).HasValue("propertyName") 
select new
{
    Id = Convert.ToInt32(n),
    Url = new Node(Convert.ToInt32(n)).Url,
    Name = new Node(Convert.ToInt32(n)).Title()
}).ToList();

無関係な注: この場合、ノード コンストラクターはメモリ キャッシュからデータを取得しています。

この例を改善して、linq を使用して各オブジェクトを 1 回だけインスタンス化するにはどうすればよいですか?

乾杯。マレー。

4

1 に答える 1

5

let次のような句を使用します。

var pods = (
    from n in ids
    let id = Convert.ToInt32(n)
    let node = new Node(id)
    where node.HasValue("propertyName") 
    select new
    {
        Id = id,
        Url = node.Url,
        Name = node.Title()
    }
).ToList();

詳細については、let 句 (C# リファレンス)を参照してください。

クエリ式では、後続の句で使用するために部分式の結果を格納すると便利な場合があります。これは、新しい範囲変数を作成し、指定した式の結果で初期化する let キーワードを使用して実行できます。値で初期化されると、範囲変数を使用して別の値を格納することはできません。ただし、範囲変数がクエリ可能な型を保持している場合は、クエリを実行できます。

于 2010-01-21T01:29:21.693 に答える