c# - 将 90000 个 XElement 添加到 XDocument

标签 c# linq .net-3.5 c#-3.0 linq-to-xml

我有一个Dictionary<int, MyClass>

它包含 100,000 个项目

填充了 10,000 个项目值,而 90,000 个项目值为空。

我有这个代码:

var nullitems = MyInfoCollection.Where(x => x.Value == null).ToList();
nullitems.ForEach(x => LogMissedSequenceError(x.Key + 1));

private void LogMissedSequenceError(long SequenceNumber)
        {
            DateTime recordTime = DateTime.Now;

            var errors = MyXDocument.Descendants("ERRORS").FirstOrDefault();
            if (errors != null)
            {

                errors.Add(
                    new XElement("ERROR",
                        new XElement("DATETIME", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss:fff")),
                        new XElement("DETAIL", "No information was read for expected sequence number " + SequenceNumber),
                        new XAttribute("TYPE", "MISSED"),
                        new XElement("PAGEID", SequenceNumber)
                        )
                );
            }
        }

这似乎需要大约 2 分钟才能完成。我似乎找不到瓶颈可能在哪里,或者这个时机听起来是否合适?

有人能看出为什么要花这么长时间吗?

最佳答案

如果您的MyInfoCollection太大了,我不会打电话ToList()这样您就可以使用ForEach扩展方法。调用ToList()将创建并填充一个巨大的列表。我会删除 ToList()调用 .ForEach进入for each声明,或者写一个 . ForEach IEnumerable<T> 的扩展方法.

然后对其进行分析并查看需要多长时间。另一件要做的事情是删除 ERRORS 的查找和空检查。元素。如果不存在,请不要调用 for each上面的声明。这样您就可以对它进行一次 null 检查,而不是 90,000 次。

另外,正如 Michael Stum 指出的那样,我定义一个字符串来保存值 DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss:fff") ,然后引用它或传入它。另外,您甚至不使用此调用:

DateTime recordTime = DateTime.Now;

关于c# - 将 90000 个 XElement 添加到 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448701/

相关文章:

c# - 创建 COM 组件和 ActiveX 控件

c# - 如何从 C# 应用程序向树莓派发送终端命令

c# - DocumentDB 查询嵌套对象

c# - Left Join List<t> with Datatable -Linq

c# - .NET 3.5 列表框选定值 (Winforms)

Windows CE 上的 C# .NET 3.5 CF,更改 DataGrid 中的行背景颜色

c# - 将 XmlNode 添加到 XmlElement

c# - 为什么 EF Core 在所需关系被清空时删除实体?

linq - 如何在 LINQ 查询中将字符串转换为十进制

c# - "i"在此 LINQ 语句中的何处获取其值?