XDocument 属性性能问题

发布于 2024-08-27 03:56:41 字数 502 浏览 4 评论 0 原文

我有一个已加载的 XDocument,我需要有效地获取等于某个值并且属于某个元素的所有属性。我当前的

IEnumerable<XElement> vm;
if (!cacher2.TryGetValue(name,out vm)) { 
    vm = project.Descendants(XName.Get(name));
    cacher2.Add(name, vm);
}


XElement[] abdl = (vm.Where(a =>  a.Attribute(attribute).Value == ab)).ToArray();

cacher2 是一个 Dictionary> ToArray,这样我现在就可以计算表达式了。我认为这不会引起任何真正的速度问题。问题在于Where 本身。我正在搜索从 1k 到 10k 的项目。

I have a loaded XDocument that I need to grab all the attributes that equal a certain value and is of a certain element efficiently. My current

IEnumerable<XElement> vm;
if (!cacher2.TryGetValue(name,out vm)) { 
    vm = project.Descendants(XName.Get(name));
    cacher2.Add(name, vm);
}


XElement[] abdl = (vm.Where(a =>  a.Attribute(attribute).Value == ab)).ToArray();

cacher2 is a Dictionary<string,IEnumerable<XElement>> The ToArray is so I can evaluate the expression now. I don't think this causes any real speed concerns. The problem is the Where itself. I am searching through anywhere from 1k to 10k items.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光礼记 2024-09-03 03:56:41

您需要调用.ToArray吗?我不清楚为什么你不能循环添加到字典(或调用 .ToDictionary)。然而;你有简介吗?如果这里存在瓶颈,您可以尝试退回到 XmlReader 并将其视为消防水带:

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
                && reader.GetAttribute("attribName") == attribValue)
            {
                /* do something interesting for fun and profit */
            }
        }

不过,使用您现有的代码,我很想做到这一点:

vm.Where(a =>  (string)a.Attribute(attribute) == ab)

不同之处在于,通过不调用 .Value,即使未设置该属性,它也应该可以工作。当然,如果您要求始终设置此属性,则在这种情况下可以接受例外。

Do you need to call .ToArray? I'm unclear on why you can't just loop over adding to the dictionary (or call .ToDictionary). However; have you profiled? If there is a bottleneck here, you might try dropping back to XmlReader and treating it as a firehose:

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
                && reader.GetAttribute("attribName") == attribValue)
            {
                /* do something interesting for fun and profit */
            }
        }

With your existing code, though, I would be very tempted to make it:

vm.Where(a =>  (string)a.Attribute(attribute) == ab)

The difference is that by not calling .Value it should work even when the attribute isn't set. Of course if you demand that this attribute is always set then an exception may be acceptable in this case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文