使用yield或更改算法优化代码

NET*_*ion 1 c# linq optimization yield linq-to-xml

下面的代码有效,但我想使用yield或更改算法来优化代码.

public IEnumerable<Book> GetAuthorWithBookName(string keyword)
{
    var bookAndAuthorList = new List<Book>();
    List<Author> AuthorNameList = getAuthorName(keyword);
    foreach (var author in AuthorNameList)
    {
        XmlNode booksNames = getBook(author);
        XDocument XDOCbooksNames = XDocument.Parse(booksNames.OuterXml);

        var bookNameList = (
            from x1 in XDOCbooksNames.Descendants("Books")
            select x1.Elements("book").Select(g => g.Attribute("name").Value))
            .ToList();
        foreach (var bookName in bookNameList)
        {
            bookAndAuthorList.Add(new Book()
            {
                authorName = author.authorName,
                bookName = bookName
            });
        }
    }
    return bookAndAuthorList;
}

public class Book
{
    public string authorName { get; set; }
    public string bookName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

yu_*_*sha 9

鲁本斯和卢克的回答正确地解释了收益率的使用.

但是,这看起来很可疑.

XmlNode booksNames = getBook(author);
XDocument XDOCbooksNames = XDocument.Parse(booksNames.OuterXml);
Run Code Online (Sandbox Code Playgroud)

您将XML转换为字符串,然后再次解析它,只是因为您想将它从DOM节点转换为Xml.Linq节点.如果您正在谈论优化,那么这比创建额外列表要低效得多.

  • 看起来最好的解决方案是让getBook的实现返回一个`XElement`或`XDocument` (2认同)

San*_*ken 6

快速获胜,您可以删除.ToList()通话.你所做的只是列举项目,所以没有必要这样做.同样,不需要创建bookAndAutherList.

最终我认为你可以把它剥离到这个:

public IEnumerable<Book> GetAuthorWithBookName(string keyword)
{
    return from author in getAuthorName(keyword)
           let book = getBook(author)
           from xmlBook in XDocument.Parse(book.OuterXml).Descendants("Books")
           select new Book
           {
               authorName = author.AuthorName,
               bookName = xmlBook.Attribute("name").Value
           };
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,我想提一下,令人惊讶的是未充分利用.另外+1给一个随机答案只是提到它!:) (2认同)