ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-12 16:08:37  阅读:255  来源: 互联网

标签:c linq linq-to-objects roslyn nemerle


虽然在某些情况下我会使用方法链编写一些东西(特别是如果它只是一两个方法,比如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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有