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)
鲁本斯和卢克的回答正确地解释了收益率的使用.
但是,这看起来很可疑.
XmlNode booksNames = getBook(author);
XDocument XDOCbooksNames = XDocument.Parse(booksNames.OuterXml);
Run Code Online (Sandbox Code Playgroud)
您将XML转换为字符串,然后再次解析它,只是因为您想将它从DOM节点转换为Xml.Linq节点.如果您正在谈论优化,那么这比创建额外列表要低效得多.
快速获胜,您可以删除.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)
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |