我正在將一個非常大的文件(2-3 GB的文本)導入集合,每次10,000個。我需要將某些業務規則應用於集合中包含的值。什麼是最好的方法來做到這一點?在一個非常大的集合中更改值(10,000)
最初的想法是創建一個自定義類的List<>
,但它變得非常沉重。此外,我不確定如何有效地更改列表中的值。例如,對於列表中的所有項目,如果屬性x是「abc」,則需要將其更改爲「xyz」。
對此提出建議?
我正在將一個非常大的文件(2-3 GB的文本)導入集合,每次10,000個。我需要將某些業務規則應用於集合中包含的值。什麼是最好的方法來做到這一點?在一個非常大的集合中更改值(10,000)
最初的想法是創建一個自定義類的List<>
,但它變得非常沉重。此外,我不確定如何有效地更改列表中的值。例如,對於列表中的所有項目,如果屬性x是「abc」,則需要將其更改爲「xyz」。
對此提出建議?
使用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";
}
你爲什麼不喜歡它? – 2012-03-28 12:38:09
@DanielHilgarth:感覺離修改迭代器太近了(這會破壞)。例如,如果你開始在一個查詢中使用'XDocument'來處理它,它就會中斷 - 在這種情況下,它*會*工作,但它太接近了,以至於不夠舒適。 – 2012-03-28 12:39:27
爲什麼在將項目放入集合之前從流中獲取值時不應用業務規則。
我建議你在內存數據庫中使用,這將有助於高效地執行提取,更新操作。由此產生的代碼將更加清潔,因爲您將使用聲明性邏輯而不是命令性邏輯。如果你是你工作場所的項目,請這樣做。
這些值是唯一的嗎? – 2012-03-28 12:30:32
爲什麼你一次需要處理10,000個?如果你能減少這個要求,那麼收益應該是顯而易見的,儘管我猜測這不是微不足道的(或者你已經這麼做了)。 – 2012-03-28 12:35:23
有什麼理由不在這裏使用完整的流?即沒有批次 - 一次只緩衝輸入/輸出和單個項目? – 2012-03-28 12:39:14