C# 搜索内存中的大型集合时出现性能问题

C# 搜索内存中的大型集合时出现性能问题,c#,performance,foreach,C#,Performance,Foreach,我编写了一个查询,从transitiondata中查找nodedata中的节点,但由于它有400万条记录,所以要走出这个循环需要相当长的时间 我们所拥有的: 1.将有从和到节点的转换数据(收集)。 2.节点数据(采集),其键等于过渡数据(采集)中的表单或到节点 从这些集合中需要什么: 1.应具有转换数据(从、到)以及节点数据(从键)和(到键)的相应节点的集合 我写的代码运行良好,但执行起来需要很多时间。下面是代码 foreach (var trans in transitions)

我编写了一个查询,从transitiondata中查找nodedata中的节点,但由于它有400万条记录,所以要走出这个循环需要相当长的时间

我们所拥有的: 1.将有节点的转换数据(收集)。
2.节点数据(采集),其键等于过渡数据(采集)中的表单节点

从这些集合中需要什么: 1.应具有转换数据(从、到)以及节点数据(从键)和(到键)的相应节点的集合

我写的代码运行良好,但执行起来需要很多时间。下面是代码

foreach (var trans in transitions)
        {
            string transFrom = trans.From;
            string transTo = trans.To;

            var fromNodeData = nodeEntitydata.Where(x => x.Key == transFrom).FirstOrDefault();
            var toNodeData = nodeEntitydata.Where(x => x.Key == transTo).FirstOrDefault();

            if (fromNodeData != null && toNodeData != null)
            {
                //string fromSwimlane = fromNodeData.Group;
                //string toSwimlane = toNodeData.Group;
                string dicKey = fromNodeData.sokey + toNodeData.sokey;
                if (!dicTrans.ContainsKey(dicKey))
                {
                    soTransition.Add(new TransitionDataJsonObject
                    {
                        From = fromNodeData.sokey,
                        To = toNodeData.sokey,
                        FromPort = fromPortIds[0],
                        ToPort = toPortIds[0],
                        Description = "SOTransition",
                        IsManual = true
                    });
                    dicTrans.Add(dicKey, soTransition);
                }
            }
        }
这就是需要时间来执行的循环。我知道问题出在那两个Where子句中。因为转换将有400k,而nodeEntitydata将有400k。有人能帮我吗?

使用直接访问字典条目:

var fromNodeData = nodeEntitydata[transFrom];
var toNodeData = nodeEntitydata[transTo];

看起来,
nodeEntitydata
只是一个普通的集合。您面临的问题是,对内存中的集合执行
,其中
,具有线性性能,并且您需要处理大量记录

你需要的是一本
字典
。这对于搜索大型集合要有效得多,因为它使用一个数组来进行搜索,而不是线性搜索

如果
nodeEntitydata
还不是一个
字典
,您可以这样从它创建一个字典:

var nodeEntitydictionary = nodeEntitydata.ToDictionary(n => n.Key);
var fromNodeData = nodeEntitydictionary[transFrom];
var toNodeData = nodeEntitydictionary[transTo];
然后,您可以这样使用字典:

var nodeEntitydictionary = nodeEntitydata.ToDictionary(n => n.Key);
var fromNodeData = nodeEntitydictionary[transFrom];
var toNodeData = nodeEntitydictionary[transTo];

创建字典的速度相当慢,因此请确保只在填充
nodeEntitydata
的位置执行一次。如果您必须频繁地重新实例化
词典
,那么您将看不到多少性能优势,因此请确保尽可能多地重用它。

注意:a
Lakh
是印度数字系统中的一个单位。它相当于十进制中的
100000
。så
400000
400000
。什么样的收集是
nodeEntityData