Возможно, мне лень спрашивать об этом здесь, но я только начинаю работать с LINQ, и у меня есть функция, которую, я уверен, можно превратить в два запроса LINQ (или один вложенный запрос), а не в LINQ и пару операторов foreach. Любые гуру LINQ захотят реорганизовать это для меня в качестве примера?
Сама функция просматривает список файлов .csproj и извлекает пути ко всем файлам .cs, включенным в проект:
static IEnumerable<string> FindFiles(IEnumerable<string> projectPaths)
{
string xmlNamespace = "{http://schemas.microsoft.com/developer/msbuild/2003}";
foreach (string projectPath in projectPaths)
{
XDocument projectXml = XDocument.Load(projectPath);
string projectDir = Path.GetDirectoryName(projectPath);
var csharpFiles = from c in projectXml.Descendants(xmlNamespace + "Compile")
where c.Attribute("Include").Value.EndsWith(".cs")
select Path.Combine(projectDir, c.Attribute("Include").Value);
foreach (string s in csharpFiles)
{
yield return s;
}
}
}





Как насчет:
const string xmlNamespace = "{http://schemas.microsoft.com/developer/msbuild/2003}";
return from projectPath in projectPaths
let xml = XDocument.Load(projectPath)
let dir = Path.GetDirectoryName(projectPath)
from c in xml.Descendants(xmlNamespace + "Compile")
where c.Attribute("Include").Value.EndsWith(".cs")
select Path.Combine(dir, c.Attribute("Include").Value);
Без проблем; в качестве небольшой оптимизации вы можете "let inc = c.Attribute (" Include "). Value", а затем где inc.EndsWith (..) выбрать inc ...
блестящий. Я знал, что StackOverflow найдет мне ответ быстрее, чем я сам, прочитав книгу LINQ! большое спасибо.