我有一个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/