首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FileNames的LINQ GroupBy

使用FileNames的LINQ GroupBy
EN

Stack Overflow用户
提问于 2012-04-29 03:11:31
回答 4查看 1.9K关注 0票数 0

正在尝试获取一组文件中的不同标识符的集合。我在这个Lambda查询中做错了什么:

代码语言:javascript
复制
   var enumDir = Directory.GetFiles(folder);
   var distinctCode = enumDir.Select(s => Path.GetFileName(s).Substring(8, 4))
                              .GroupBy(s => s.ToString());

先谢谢你...

编辑

@empi建议。我希望从文件名中获得不同的4个字母的子字符串的列表,我得到的是什么都没有,或者是我放入的第一个Path.Get……也是组的一部分,我得到了一个索引超出范围的异常。

@Oskar Kjellin建议我应该提一下,每个文件名都有45个字符的设置长度

最终解决方案|感谢empi和Oskar

代码语言:javascript
复制
var enumDir = Directory.GetFiles(folder).Where(a => Path.GetFileName(a).Length > 12);
var distinctCode = enumDir.Select(s => Path.GetFileName(s).Substring(8, 4)).Distinct();

真的是这两个建议的组合,我真的不知道该为谁标记答案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-29 03:20:27

在调用子字符串之前,应始终检查长度,以避免出现异常...

代码语言:javascript
复制
 enumDir = Directory.GetFiles(folder);
 distinctCode = enumDir.Select(s => Path.GetFileName(s))
.Select( s=> s.Length >= 12 ? s.Substring(8, 4) : s).GroupBy(s => s);

您永远无法真正控制文件夹中有哪些文件。例如,windows可以创建thumbs.db,这是图像或其他临时文件的缩略图的缓存。

也许您只想过滤掉具有固定长度的那些:

代码语言:javascript
复制
 enumDir = Directory.GetFiles(folder);
 distinctCode = enumDir.Select(s => Path.GetFileName(s)).Where(s=>s.Length == 45)
.Select( s=> s.Substring(8, 4)).GroupBy(s => s);
票数 1
EN

Stack Overflow用户

发布于 2012-04-29 03:24:21

enumDir.Select(s => Path.GetFileName(s).Substring(8, 4)) -这段代码应该返回IEnumerable<string> - check,如果这个集合是ok的话。如果可以,那么就使用Distinct()

票数 1
EN

Stack Overflow用户

发布于 2012-04-29 03:34:09

我怀疑您想要的是获取实际的文件名,但是按子字符串对它们进行分组。

代码语言:javascript
复制
var result = Directory.GetFiles(folder)
    .Select(s => Path.GetFileName(s))
    .Where(s => s.Length > 12)
    .GroupBy(s => s.Substring(8, 4));

现在,在result中,您拥有以Key为子字符串的组对象,如果枚举它们,您将获得与该键匹配的实际文件名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10366691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档