Хотя есть несколько случаев, когда я буду писать что-то, используя цепочки методов (особенно если это всего лишь один или два метода, например foo.Where (..). ToArray()), во многих случаях я предпочитаю запрос LINQ понимание синтаксиса вместо («запрос выражения» в спецификации), так что-то вроде:Доступные опции для «поддельного» linq-синтаксиса синтаксиса keywordsin C#?
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(); или
упаковка запроса с помощью parens и пометки на 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 (I думаю, что это будет вариант, но не совсем уверен?). Я не знаю достаточно о том, что Roslyn делает/будет поддерживать, поэтому, если кто-то знает, может ли он позволить кому-то «продлить» C#, как это, пожалуйста, звоните!
Те, я бы, вероятно, использовать большинство (хотя я уверен, что есть много других, но только, чтобы получить через идею/что я надеюсь на):
ascount - прообразы графу()
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()
(вы могли бы, очевидно, продолжать идти на первой (), Single(), Any() и т. Д., Но при попытке держать вопрос в области проверки)
Меня интересуют только методы расширения, которым не нужны параметры. Я не пытаюсь делать такие вещи с (например) ToDictionary или ToLookup.:)
Итак, в заключение:
- хотите добавить 'ascount', 'aslist' и '' asarray в Linq запрос выражения
- не знаю, если это уже решена
- не знаю, если Nemerle является хорошим выбором для этого
- не знаю, если история Рослин будет поддерживать этот вид использования
Roslyn делает * не * позволяет расширить язык C#! См. Блог Эрика Липперта (http://blogs.msdn.com/b/ericlippert/archive/2011/10/19/the-roslyn-preview-is-now-available.aspx). –
@Cicada: Было бы более точно сказать, что добавление языковых расширений не является * целью * Roslyn; целью Roslyn является предоставление пользователям лексических, синтаксических и семантических аналитических механизмов компилятора. Если они найдут какой-то сумасшедший способ использовать эти двигатели для расширения языка, это хорошо для них. Но мы не разрабатываем Roslyn как механизм добавления языковых расширений; мы разрабатываем его как механизм для пользователей, чтобы потреблять те же механизмы анализа, которые потребляют компилятор и команды IDE. –
Лично я отделил бы ваш запрос от подсчета: 'var query = from [...];' 'int count = query.Count();' Я думаю, что это выглядит не так уродливо, как обертывание всего запроса, и, кроме того, вы может повторно использовать запрос, если вам это нужно для других вещей, помимо подсчета в будущем. – ordag