12

私のタイトルは自明なので、修正する方法は知っていますが、そもそもなぜそうなのですか?

シナリオ

VB.Net コードを書きました

Dim list As List(Of String) = New List(Of String)

//Code to populate list

Dim wherelinq As IEnumerable(Of String) = From s In list Where s.StartsWith("A")

これは正常に機能し、エラーは発生しません

しかし、C# の同じロジックは失敗します

List<string> list = new List<string>();

//Code to populate list

IEnumerable<string> wherelinq = from s in list where s.StartsWith("A");

これによりエラーが発生します

ここに画像の説明を入力

C# でのこの制限はなぜですか? 私が見逃している特定のものはありますか?

4

4 に答える 4

5

VB.NET と C# は異なる言語であるため、当然のことながら LINQ クエリ構文も異なります。C# には が必要ですがselect s、VB.NET には必要ありません。

Microsoft のドキュメントselectでは、C# のクエリ構文クエリは、またはで終わる必要がありますgroup

クエリ式は、from 句で開始し、select または group 句で終了する必要があります。最初の from 句と最後の select または group 句の間に、1 つまたは複数のオプションの句 (where、orderby、join、let、および追加の from 句) を含めることができます。また、into キーワードを使用して、結合句またはグループ句の結果を、同じクエリ式内の追加のクエリ句のソースとして使用できるようにすることもできます。

構文の詳細については、C# 言語仕様のセクション 7.16 を参照してください。

var wherelinq = from s in list where s.StartsWith("A") select s;

select関数構文を使用する場合は、追加する必要はありません。

var wherelinq = list.Where(s => s.StartsWith("A"));
于 2012-10-20T12:42:25.083 に答える
4

これは実際には縮退選択と呼ばれます。クエリがコンパイルされるラムダ構文を使用する場合は、これは必要ありません。なぜこの制限が必要なのか、私にはよくわかりません。これらはおそらく、実際に存在する必要がなかったコンパイラ関連の制限です。

于 2012-10-20T23:30:14.903 に答える
-2

理由の 1 つは、select節がないとあいまいさが生じることです。where false次の例では、犬と骨のどちらをフィルター処理するかをコンパイラーはどのように判断しますか?

from dog in dogs
let gifts = from bone in bones
            where false

ただし、質問の半分はまだ答えられていません。VB はどのようにしてこのような曖昧さを回避していますか?

于 2012-10-20T14:04:39.173 に答える
-2

Where()縮退した select ケースでは、Where().Select()論理的に同等のコレクションを返す必要があるという事実にもかかわらず、このSelect()句は表面的には冗長に見えますが、戻り値の型は異なる場合があります。の戻り値の型はWhere()最終用途ではなく、 のような追加のクエリ操作との連鎖を目的としている可能性がありますSelect()。つまり、操作Where()を追加する以外に、 の戻り値に対して有用なことは何もできませんSelect()selectまたはで終わることを要求することにより、最終用途に適しgroupた の戻り値を必要としないという意味で、C# が LINQ プロバイダーに課す要件が少なくなりWhere()、これにより の設計の柔軟性が向上しますWhere()

于 2016-04-14T09:44:04.127 に答える