如何使用LINQ返回FileInfo.Name的子字符串

4
我希望将下面的 "foreach" 语句转换为一个 LINQ 查询,该查询返回文件名的子字符串到一个列表中:
IList<string> fileNameSubstringValues = new List<string>();

//Find all assemblies with mapping files.
ICollection<FileInfo> files = codeToGetFileListGoesHere;

//Parse the file name to get the assembly name.
foreach (FileInfo file in files)
{
    string fileName = file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")));
    fileNameSubstringValues.Add(fileName);
}

最终结果将类似于以下内容:
IList<string> fileNameSubstringValues = files.LINQ-QUERY-HERE;

2
这里没有查询,只是从A[]到B[]的转换。 - Jay Bazuzi
4个回答

6

尝试类似以下方式:

var fileList = files.Select(file =>
                            file.Name.Substring(0, file.Name.Length -
                            (file.Name.Length - file.Name.IndexOf(".config.xml"))))
                     .ToList();

1
投票支持:在这里,我更喜欢使用扩展方法语法而不是查询语法,因为实际上并没有查询:你的目标是对所有元素执行转换。没有“where”、“orderby”或交叉的“select”,甚至没有“select new { x, y }”。 - Jay Bazuzi
@Jay,我也更喜欢使用扩展方法语法来进行简单的投影操作,查询语法我只在进行连接操作时使用... - Christian C. Salvadó
更好的原因是:1)流畅的接口 2)不需要在查询周围加括号。 - user1228

2
IList<string> fileNameSubstringValues =
  (
    from 
      file in codeToGetFileListGoesHere
    select 
      file.Name.
        Substring(0, file.Name.Length - 
          (file.Name.Length - file.Name.IndexOf(".config.xml"))).ToList();

享受 =)


2
如果您知道FileInfo集合的类型是List<FileInfo>,那么我可能会跳过Linq并编写以下代码:
        files.ConvertAll(
            file => file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))
            );

或者如果它是一个数组:

        Array.ConvertAll(
            files,
            file => file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))
            );

主要是因为我喜欢使用“转换”而不是“选择”来表达我的意图,这样对于阅读此代码的程序员来说更加清晰明了。
然而,Linq现在是C#的一部分,所以我认为坚持让阅读代码的程序员理解Select的作用是完全合理的。而且Linq方法可以让你轻松地将来迁移到PLinq。

1

FYI,

file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))

等同于

file.Name.Substring(0, file.Name.IndexOf(".config.xml"));

此外,如果文件名的末尾出现了字符串“.config.xml”,你的代码可能会返回错误的结果;你应该将IndexOf更改为LastIndexOf,并检查返回的索引位置+11(字符串的大小)是否等于文件名的长度(假设你正在查找以.config.xml结尾的文件,而不仅是在名称中出现.config.xml的文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接