1

できます:

var something = things.Where(thing => thing.stuff == yup);
var somethingelse = something.Select(thing => thing.otherstuff);

また

var something = from thing in things
                where thing.stuff == yup
                select thing;
var somethingelse = from thing in something
                    select thing.otherstuff;

明らかに、これが現実の世界である場合、キーワード バージョンの実行には利点があります。

var somethingelse = from thing in something
                    where thing.stuff == yup
                    select thing.otherstuff;

しかし、もちろん、次のことができると主張することもできます。

var somethingelse = things.Where(thing => thing.stuff == yup)
                          .Select(thing => thing.otherstuff);

とにかく質問自体:これらの各バリアントを使用することの長所/短所は何ですか? それらは同一ですが、コード側の構文が異なるだけですか? 2 つのメソッド バージョンを組み合わせると (つまり、上記の where/select)、両方を 1 行にまとめたキーワード構文を使用するよりも効率が悪くなりますか?

私はLINQが大好きで、何らかの型を使用することで得られる効率を失いたくありません。

4

5 に答える 5

3

クエリ構文は、最初のパスでコンパイラによってメソッド構文に変換され、2 番目のパスでそのメソッド構文から IL コードにコンパイルされます。クエリ構文を使用して記述されたコードと、メソッド構文で直接記述されたコードとの間で、コンパイルされたコードの結果に違いはありません。(ただし、すべてのメソッドがクエリ構文で表現されているわけではないため、メソッド構文を部分的または完全に使用しないと記述できないクエリもあります。)

唯一の違いは、コーダーの個人的な好みです。読みやすく書きやすいと思うもの。

私の個人的な経験から、特定のタイプのクエリは、ある構文で他の構文よりも読み書きしやすいですが、それは完全に意見の問題であり、人によって異なります。どのような状況でも、最も使いやすい方を使用してください。

于 2013-05-10T17:18:00.447 に答える
0

クエリ構文 (LINQ キーワードを使用) を使用する場合、コンパイラはコードを対応する LINQ メソッド呼び出しに変換し、同等のコードを生成します。クエリに関する限り、パフォーマンスに違いはなく、それぞれが同じ結果を生成するはずです。どちらがより快適であるかに応じて、クエリの読みやすさにのみ影響します。

クエリ構文の唯一の "問題" (そのように見える場合) は、特定の LINQ メソッドのセットに変換されることです。使用可能なすべての LINQ メソッドを見ると、多くの標準演算子で使用できる追加のオーバーロードと、クエリ構文では使用できないその他のメソッドがあります。このようなクエリでは、これらのメソッドを使用できません。

たとえばDistinct()、クエリ構文を使用するクエリで演算子を使用することはできません (現時点では、うまくいけば将来のバージョンでバックポートされます)。使用したい場合は、メソッド構文を使用する必要があります。そのため、構文を混在させるか (クエリがより複雑になると少し見苦しくなります)、メソッド呼び出しのみを使用する必要があります。

// get all distinct user names
var query1 =
    (from user in Users
    select user.Name).Distinct();

// vs.
var query2 = Users
    .Select(user => user.Name)
    .Distinct();

私に尋ねられた場合は、可能な限りクエリ構文を使用してください。どうしても必要な場合は、メソッド呼び出し構文を使用してください。スタイルを混在させることは判断の呼びかけです。より読みやすく、一貫性があるものを選択してください。

于 2013-05-10T17:34:17.520 に答える