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<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);
}
The end result would be something similar to the following:
IList<string> fileNameSubstringValues = files.LINQ-QUERY-HERE;
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();
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 =)
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.
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).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.