实现以下场景的方式(优化):在列表中拆分对象<t>

时间:2016-09-14 08:13:39

标签: c# list dictionary optimization

在这里,我需要根据数量拆分(克隆)原始对象。每当我拆分对象时,都会为新创建的Object分配新的BaseID。 (请耐心等待)

我想要实现的目标:

每当一个对象(源)分裂时,新创建的对象应该在下一次添加到源对象(如果源索引为0,则在索引1处)。

**这就是我维护Object **的方式

我使用List来存储对象,这意味着最后会添加新创建的对象。

什么是瓶颈

1)未知来源索引 - 基于某些过滤我选择了来源,因此我不知道源对象的索引

2)平均我将执行的分割数 - 平均情况为每秒300到400次。

3)列表的大小 - 使用当前的方法,我开始使用对象计数300(在列表中),经过半处理后,它已达到600万。

例如:在输入中,我有以下列表,请注意每个新创建的对象的BaseID更改,而当输入转换为对象时,Org_BaseID永远不会更改并等于BaseID。

输入列表是根据某些字段(现在为Say Date)排序的,因此新分割的Object将与Order by fields字段的原始对象具有相同的值。

Input

分割的一个例子

步骤1:根据数量拆分Object1(BaseID:S1,数量为100),例如80,20。请注意Org_BaseID永远不会更改,而New BaseID会分配给新对象。这是结果输出。

Step 1

步骤2:使用BaseID拆分对象:S5基于数量,比如15,5。这是结果列表。

Step 2

步骤3:使用BaseID拆分对象:S1基于数量,说70,10。

Step 3

步骤4:如果我按最终列表排序,我将根据插入顺序对对象进行排序。

Step 4

同样,如果数量大于0,任何对象都可以分割任意数量的时间。

方法我尝试过:

1)包括排序顺序字段,每当源对象拆分时,更新所有其他对象的排序顺序。 (如果具有排序顺序2的对象拆分,则将3个排序顺序分配给新对象,从而将排序顺序大于2的每个对象的排序顺序更新为当前排序顺序值+ 1),更新所有列表即O(n)

enter image description here

2)使用键As Org_BaseID维护字典,而不是更新所有列表,更新具有特定Org_baseID的对象的排序顺序。

enter image description here

还有其他方法,我可以试试吗?

先谢谢,并感谢所有建议。

1 个答案:

答案 0 :(得分:0)

我试过的方法

1)Allan S Approach-插入一个Object而不是添加。

  • 对于较少数量的分割(最多30,000)这是一个很好的方法,但随着记录的增长,由于O(n)的复杂性,它开始花费更多的时间。

我尝试了新方法

- 而不是在列表中插入或添加拆分对象(问题中提到的AVG 300到400 Add),我使用 Dictionary&lt;字符串,对象&gt; (以确保O(1))跟踪分割。

工作原理

  • 对于每个拆分,在字典中添加对象(源对象的BaseID作为键,值将是新对象)。一个对象只会为当前循环拆分一个,因此密钥将是唯一的。

  • 一旦拆分(其中一个循环),我将遍历主列表并创建一个新列表。对于主列表中的每个对象,我将添加将其添加到新列表中,然后将检查字典中是否存在给定BaseID的任何键,如果它在那里,则将其添加到新列表中。

  • 使用这种方法,我只会重新创建一次List,并且它适用于较大的输入(比我的旧方法更好,即每次拆分的更新列表)。

setdefault

我将尝试使用Linked List并检查性能。