メソッド チェーンを使用して何かを記述するケースはいくつかありますが (特に、foo.Where(..).ToArray() のような 1 つまたは 2 つのメソッドの場合)、多くの場合、LINQ クエリ内包構文を好みます。代わりに(仕様の「クエリ式」)、次のようになります。
var query =
from filePath in Directory.GetFiles(directoryPath)
let fileName = Path.GetFileName(filePath)
let baseFileName = fileName.Split(' ', '_').First()
group filePath by baseFileName into fileGroup
select new
{
BaseFileName = fileGroup.Key,
Count = fileGroup.Count(),
};
それらのかなり大きなチャンクでは、結果の IEnumerable を取り、それをデータ構造 (配列、リストなど) に熱心にロードする必要があります。これは通常、次のいずれかを意味します。
var queryResult = query.ToArray(); のような別のローカル変数を追加します。また
クエリを括弧で囲み、ToArray (または ToList など) にタグ付けします。
var query = (
from filePath in Directory.GetFiles(directoryPath)
let fileName = Path.GetFileName(filePath)
let baseFileName = fileName.Split(' ', '_').First()
group filePath by baseFileName into fileGroup
select new
{
BaseFileName = fileGroup.Key,
Count = fileGroup.Count(),
}
).ToArray();
他の人がどのオプションを使用しているか、または 2) いくつかの追加の「コンテキスト キーワード」を追加することが実行可能であると考えることができるオプションを見つけようとしています。あたかもLINQキーワードが「ネイティブに」拡張可能であるかのように:)
おそらく、これはある種の前処理 (C# のこの領域に何があるかはわかりません) か、Nemerleのようなものに使用されるコンパイラーの変更(オプションになると思いますが、確かではありませんか? )。私は Roslyn が何をサポートするか、またはサポートするかについてまだ十分に知らないので、誰かがこのように C# を「拡張」できるかどうかを知っている人がいたら、声をかけてください!
私が最も使用する可能性が高いもの(他にもたくさんあると確信していますが、アイデアを理解するため/私が望んでいること):
ascount - Count() に変換
int zFileCount =
from filePath in Directory.GetFiles(directoryPath)
where filePath.StartsWith("z")
select filePath ascount;
これは、次のように「変換」されます (最終結果がそうである限り、パスが何であるかは関係ありません)。
int zFileCount = (
from filePath in Directory.GetFiles(directoryPath)
where filePath.StartsWith("z")
select filePath
).Count();
同様に:
- asarray - ToArray() に変換します
- aslist - ToList() に変換
(明らかに、First()、Single()、Any() などを続けることもできますが、質問の範囲を抑えるようにしてください:)
パラメーターを渡す必要のない拡張メソッドにのみ関心があります。私は、(たとえば) ToDictionary や ToLookup でこの種のことをしようとしているわけではありません。:)
つまり、要約すると:
- 「ascount」、「aslist」、および「asarray」をlinqクエリ式に追加したい
- これがすでに解決されているかどうかはわかりません
- Nemerleがこれに適しているかどうかはわかりません
- Roslyn の話がこの種の使用をサポートするかどうかはわかりません