I would like to convert the below \"foreach\" statement to a LINQ query that returns a substring of the file name into a list:
IList fileNameSu
If you happen to know the type of the collection of FileInfo
s, and it's a List<FileInfo>
, I'd probably skip the Linq and write:
files.ConvertAll(
file => file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))
);
or if it's an array:
Array.ConvertAll(
files,
file => file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))
);
Mainly because I like saying "Convert" instead of "Select" to express my intent to a programmer reading this code.
However, Linq is part of C# now, so I think it's perfectly reasonable to insist that a reading programmer understand what Select
does. And the Linq approach lets you easily migrate to PLinq in the future.
IList<string> fileNameSubstringValues =
(
from
file in codeToGetFileListGoesHere
select
file.Name.
Substring(0, file.Name.Length -
(file.Name.Length - file.Name.IndexOf(".config.xml"))).ToList();
Enjoy =)
Try something like this:
var fileList = files.Select(file =>
file.Name.Substring(0, file.Name.Length -
(file.Name.Length - file.Name.IndexOf(".config.xml"))))
.ToList();
FYI,
file.Name.Substring(0, file.Name.Length - (file.Name.Length - file.Name.IndexOf(".config.xml")))
is the same as
file.Name.Substring(0, file.Name.IndexOf(".config.xml"));
Also, if that string ".config.xml" appears before the end of the file name, your code will probably return the wrong thing; You should probably change IndexOf to LastIndexOf and check that the index position returned + 11 (the size of the string) == length of the filename (assuming you're looking for files ending in .config.xml and not just files with .config.xml appearing somewhere in the name).