2012-03-28 22 views
2

我正在将一个非常大的文件(2-3 GB的文本)导入集合,每次10,000个。我需要将某些业务规则应用于集合中包含的值。什么是最好的方法来做到这一点?在一个非常大的集合中更改值(10,000)

最初的想法是创建一个自定义类的List<>,但它变得非常沉重。此外,我不确定如何有效地更改列表中的值。例如,对于列表中的所有项目,如果属性x是“abc”,则需要将其更改为“xyz”。

对此提出建议?

+0

这些值是唯一的吗? – 2012-03-28 12:30:32

+0

为什么你一次需要处理10,000个?如果你能减少这个要求,那么收益应该是显而易见的,尽管我猜测这不是微不足道的(或者你已经这么做了)。 – 2012-03-28 12:35:23

+3

有什么理由不在这里使用完整的流?即没有批次 - 一次只缓冲输入/输出和单个项目? – 2012-03-28 12:39:14

回答

5

使用List<T>应该是绝对好的。如果你只需要迭代,你可能可能想要考虑使用LinkedList<T>,但我希望IO能使这里的其他所有东西变得更加渺小。

至于你的变化:

foreach (var item in list) 
{ 
    if (item.Property == "abc") 
    { 
     item.Property = "xyz"; 
    } 
} 

...大约是容易读,因为它得到,IMO。你可能使用如果你真的想或LINQ - 但我通常不喜欢改变查询结果中的值,如果它会改变结果。例如:

// I dislike doing this, though it would work: 
foreach (var item in list.Where(x => x.Property == "abc")) 
{ 
    item.Property = "xyz"; 
} 
+1

你为什么不喜欢它? – 2012-03-28 12:38:09

+4

@DanielHilgarth:感觉离修改迭代器太近了(这会破坏)。例如,如果你开始在一个查询中使用'XDocument'来处理它,它就会中断 - 在这种情况下,它*会*工作,但它太接近了,以至于不够舒适。 – 2012-03-28 12:39:27

3

为什么在将项目放入集合之前从流中获取值时不应用业务规则。

0

我建议你在内存数据库中使用,这将有助于高效地执行提取,更新操作。由此产生的代码将更加清洁,因为您将使用声明性逻辑而不是命令性逻辑。如果你是你工作场所的项目,请这样做。

相关问题