gpt4 book ai didi

c# - 检查树结构中的每个节点,Umbraco(提高效率)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:32 32 4
gpt4 key购买 nike

我正在编写一些 C#(.NET) 来使用 Umbraco 4.7 将文章导入博客。简而言之,该算法旨在循环遍历每篇现有文章,并检查它是否与我们尝试从 XML 中提取的新文章具有相同的 ID。该算法运行良好,但我忍不住认为,对于我正在做的事情而言,拥有四个 foreach 循环效率极低。

foreach (Document yearNode in node.Children) //News > Years
{
foreach (Document monthNode in yearNode.Children) //Years > Months
{
foreach (Document dayNode in monthNode.Children) //Months > Days
{
foreach (Document newsItem in dayNode.Children) //Days > Articles
{
// If there isn't an ID match, go ahead and create a new article node.
}

这是没有主要功能的基本算法,只有 foreach 循环。它比简单地循环日历日期要复杂一些,因为它更像是一个包含特定节点的文件夹结构。任何人都可以提出一种简化方法吗?

最佳答案

使用通过 DocumentType 获取所有文章节点的想法, 你可以使用相当于 this GetDescendants extension method 的遍历特定文档类型的节点。

该方法是专门为 NodeFactory 的 Node 编写的类,但可以很容易地为 Document 重写.要使用扩展方法,您需要创建一个新类并将其设为静态。示例:

using System;
using System.Collections.Generic;
using umbraco.cms.businesslogic.web;

namespace Example
{
static class Extensions
{
public static IEnumerable<Document> GetDescendants(this Document document)
{
foreach (Document child in document.Children)
{
yield return child;

foreach (Document grandChild in child.GetDescendants())
{
yield return grandChild;
}
}
yield break;
}
}
}

然后在我们的上下文中使用该方法:

var myDocuments = new Document(folderId)
.GetDescendants()
.Cast<Document>()
.Where(d => d.ContentType.Alias == "myDocumentType");

if (myDocuments.Any(d => d.Id == myId))
{
...
}

注意:我不确定为什么,但似乎 .OfType<Document>().Cast<Document>().GetDescendants() 之后需要. (请参阅下面的编辑)

使用 NodeFactory 的 Node 会更有效率而不是 Document因为 NodeFactory 从 XML 缓存中提取信息并且不会像 Document 那样每次都调用数据库做。使用 NodeFactory 的唯一缺点是它只包含那些已发布的节点,但通常您只想使用这些节点。参见 Difference between Node and Document .

编辑:经过一些修改后,我发现 Document已经包含一个 GetDescendants()方法并返回 IEnumerable这就是为什么我们必须做 .Cast<Document>() .所以看起来如果您选择仍然使用 Document 就可以避免创建扩展方法。 .否则,如果您仍想使用类似于上述扩展方法的方法,则需要将其重命名为其他名称。

关于c# - 检查树结构中的每个节点,Umbraco(提高效率),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11391823/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com