2012-03-28 61 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

我建議你在內存數據庫中使用,這將有助於高效地執行提取,更新操作。由此產生的代碼將更加清潔,因爲您將使用聲明性邏輯而不是命令性邏輯。如果你是你工作場所的項目,請這樣做。

相關問題