C# 使用屈服或改变算法优化代码
下面的代码可以工作,但我想使用yield或通过更改算法来优化代码C# 使用屈服或改变算法优化代码,c#,linq,optimization,linq-to-xml,yield,C#,Linq,Optimization,Linq To Xml,Yield,下面的代码可以工作,但我想使用yield或通过更改算法来优化代码 public IEnumerable<Book> GetAuthorWithBookName(string keyword) { var bookAndAuthorList = new List<Book>(); List<Author> AuthorNameList = getAuthorName(keyword); foreach (var author in Aut
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; }
}
试试这个:
foreach (var bookName in bookNameList)
{
yield return new Book()
{
authorName = author.authorName,
bookName = bookName
};
}
并删除其他返回语句。尝试以下操作:
foreach (var bookName in bookNameList)
{
yield return new Book()
{
authorName = author.authorName,
bookName = bookName
};
}
并删除其他返回语句。不确定您会得到多少“优化”。当您经常中断使用正在生成的枚举时,最好使用Yield,这样您就不会进行不必要的计算。但这里有: 这是未经测试的
public IEnumerable<Book> GetAuthorWithBookName(string keyword)
{
foreach (var author in getAuthorName(keyword))
{
XDocument XDOCbooksNames = XDocument.Parse(getBook(author).OuterXml);
var bookNameList = from x1 in XDOCbooksNames.Descendants("Books")
select x1.Elements("book").Select(g => g.Attribute("name").Value);
foreach (var bookName in bookNameList)
{
yield return new Book()
{
authorName = author.authorName,
bookName = bookName
};
}
}
}
我所做的:
拆下屏幕上的收费表
表达式,它已返回
可枚举的。删除了一些代码
将getAuthorName合并到
foreach note-如果可以的话,请确保函数也会产生和ienumerable
返回而不是添加到列表中
不确定你会得到多少“优化”。当您经常中断使用正在生成的枚举时,最好使用Yield,这样您就不会进行不必要的计算。但这里有: 这是未经测试的
public IEnumerable<Book> GetAuthorWithBookName(string keyword)
{
foreach (var author in getAuthorName(keyword))
{
XDocument XDOCbooksNames = XDocument.Parse(getBook(author).OuterXml);
var bookNameList = from x1 in XDOCbooksNames.Descendants("Books")
select x1.Elements("book").Select(g => g.Attribute("name").Value);
foreach (var bookName in bookNameList)
{
yield return new Book()
{
authorName = author.authorName,
bookName = bookName
};
}
}
}
我所做的:
拆下屏幕上的收费表
表达式,它已返回
可枚举的。删除了一些代码
将getAuthorName合并到
foreach note-如果可以的话,请确保函数也会产生和ienumerable
返回而不是添加到列表中
作为快速赢款,您可以删除.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
};
}
作为快速赢款,您可以删除.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
};
}
鲁本斯和卢克的回答正确地解释了产量的使用 然而,这在我看来是可疑的
XmlNode booksNames = getBook(author);
XDocument XDOCbooksNames = XDocument.Parse(booksNames.OuterXml);
您将XML转换为字符串,然后再次解析它,只是因为您希望将它从DOM节点转换为XML.Linq节点。如果您谈论的是优化,那么这比创建额外列表效率要低得多 鲁本斯和卢克的回答正确地解释了产量的使用 然而,这在我看来是可疑的
XmlNode booksNames = getBook(author);
XDocument XDOCbooksNames = XDocument.Parse(booksNames.OuterXml);
您将XML转换为字符串,然后再次解析它,只是因为您希望将它从DOM节点转换为XML.Linq节点。如果您谈论的是优化,那么这比创建额外列表效率要低得多 使用yield不会给您带来真正的好处,因为您无论如何每次迭代都会创建一个新的Book对象。@Aviad,这可能会有帮助,如果在循环中存在一个退出条件,其中Book实例正在被消耗。使用yield不会给您带来真正的好处,因为您无论如何每次迭代都会创建一个新的Book对象。@Aviad,这可能会有帮助,如果存在书籍实例被消费的循环中的退出条件,那么最好的解决方案就是有一个返回XElement或XDocument@yu_shagetBookauthor是一个返回XmlNode的第三方web服务。我可以编写代码从XmlNode获取书名,但我认为使用LINQ很容易。可能是这样使用LINQ很容易编码,但将XML树转换为字符串并返回的效率很低,而且感觉很脏。如果您这样做,那么优化此函数中的任何其他内容都没有意义。这样做的唯一原因是使用LINQ。但LINQ只是提取节点的方便语法糖。XmlElement有足够的接口来实现这一点。看起来最好的解决方案是有一个返回XElement或XElement的getBook实现XDocument@yu_shagetBookauthor是返回XmlNode的第三方web服务。我可以编写代码从XmlNode获取书名,但我认为使用LINQ很容易。编写代码可能很容易使用LINQ,但将XML树转换为字符串并返回是低效的,而且感觉很脏。如果您这样做,那么优化此函数中的任何其他内容都没有意义。这样做的唯一原因是使用LINQ。但LINQ只是提取节点的方便语法糖。XmlElement有足够的接口来实现这一点。这是最好的响应+1. @NETQuestion:LINQ自动构建实现延迟迭代的IEnumerable查询,即在迭代期间使用yield关键字。只要您可以将数据源保存在内存中,并且您的代码肯定暗示您可以这样做,只需返回LINQ查询本身,您就可以了。此外,我还想指出,let的使用率出人意料地低。再加一个+1的随机答案,只是为了提醒一下!:+我只是想等等,这是F还是什么LINQ本身就是一种语言,这是最好的回应+1. @NETQuestion:LINQ自动构建实现延迟迭代的IEnumerable查询,即在迭代期间使用yield关键字。只要您可以将数据源保存在内存中,并且您的代码肯定暗示您可以这样做,只需返回LINQ查询本身,您就可以了。此外,我还想指出,let的使用率出人意料地低。
再加一个+1的随机答案,只是为了提醒一下!:+我只是想等等,这是F还是什么LINQ本身就是一种语言。