编程语言
首页 > 编程语言> > C#中“假”linq理解语法关键字的可用选项?

C#中“假”linq理解语法关键字的可用选项?

作者:互联网

虽然在某些情况下我会使用方法链编写一些东西(特别是如果它只是一两个方法,比如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和eager-load加载到数据结构(数组,列表,等等)中.这通常意味着:

>添加另一个局部变量,如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那样(我认为这是一个选项,但不是很确定? ).我对罗斯林所做的/将支持的内容还不太了解,所以如果有人知道是否可以允许某人像这样“扩展”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来做这种事情.

标签:c,linq,linq-to-objects,roslyn,nemerle
来源: https://codeday.me/bug/20190712/1442344.html