Хотя есть несколько случаев, когда я что-то напишу, используя цепочки методов (особенно, если это всего лишь один или два метода, например, foo.Where (..). ToArray ()), во многих случаях я предпочитаю 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();
Я пытаюсь выяснить, какие варианты другие либо 1) уже используют, либо 2) могли бы посчитать возможным добавить некоторые дополнительные «контекстные ключевые слова» - просто вещи, которые могли бы преобразовываться в методы расширения так же, как существующие некоторые делают, как если бы ключевые слова LINQ были «изначально» расширяемыми:)
Я понимаю, что, скорее всего, это будет означать либо какую-то предварительную обработку (не уверен, что там в этой области для C #), либо изменение используемого компилятора на что-то вроде Nemerle (я думаю, что это будет будет вариант, но не совсем уверен?). Я пока не знаю достаточно о том, что Рослин делает / будет поддерживать, поэтому, если кто-то знает, может ли он позволить кому-то «расширять» 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();
* +1034 * Аналогично:
- asarray - преобразуется в ToArray ()
- aslist - преобразуется в ToList ()
(очевидно, вы могли бы продолжать использовать First (), Single (), Any () и т. Д., Но пытаться контролировать область вопроса:)
Меня интересуют только методы расширения, которым не нужно передавать параметры. Я не ищу попытки сделать что-то подобное с (например) ToDictionary или ToLookup. :)
Итак, в итоге:
- хотите добавить 'ascount', 'aslist' и 'asarray' в выражения запроса linq
- не знаю, было ли это уже решено
- не знаю, является ли Nemerle хорошим выбором для этого
- не знаю, поддержит ли история Рослин этот вид использования