Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用屈服或改变算法优化代码_C#_Linq_Optimization_Linq To Xml_Yield - Fatal编程技术网

C# 使用屈服或改变算法优化代码

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

下面的代码可以工作,但我想使用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; }
}
试试这个:

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本身就是一种语言。