Как я могу объединить этот код в один или два запроса LINQ? - PullRequest
5 голосов
/ 18 октября 2008

Возможно, я немного ленивый спрашиваю об этом здесь, но я только начинаю с 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;
        }
    }
}

1 Ответ

8 голосов
/ 18 октября 2008

Как насчет:

        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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...