2008-11-15 44 views
1

讓我們先從下面的代碼片段:更改項目直通方法

Foreach(Record item in RecordList){ 
    .. 
    item = UpdateRecord(item, 5); 
    .. 
} 

的UpdateRecode功能改變了項目的一些領域,並返回改變的對象。在這種情況下,編譯器會拋出一個異常,表示該項無法在每次迭代中更新。

現在UpdateRecord方法改變,使其返回void和片段是這樣的:

Foreach(Record item in RecordList){ 
    .. 
    UpdateRecord(item, 5); 
    .. 
} 

在這種情況下,該項目將被更新,因爲記錄是引用類型。但它使代碼不可讀。

我正在做的項目有很多foreach循環,而且代碼一遍又一遍,所以我想創建更新記錄部分的方法。有沒有一個很好的方法來做到這一點?使代碼更具可讀性,而不是進一步摧毀它的一種方法?

回答

1

如果您需要更新集合,請不要使用迭代器模式,就像您說的那樣,它可能會出錯或出現錯誤。

我發現在這種情況下使用for循環的索引更清晰一些,因爲它非常明顯地表明你想要這樣做。

+0

謝謝,我認爲這是在我的情況下唯一正確的方法。 – Sorskoot 2008-11-15 15:53:25

+1

使用迭代器模式更新集合中的項目絕對沒有錯。迭代時,您不想在集合中添加或刪除項目,這就是編譯器所抱怨的。 – 2008-11-15 17:39:40

0

是否需要更新相同的列表?你可以返回一個新的(更新)枚舉嗎?

foreach(Record item in RecordList){ 
    .. 
    yield return GetUpdatedRecord(item, 5); 
    .. 
} 
1

編譯器抱怨,你不能更新收集,不予備案。通過執行item = UpdateRecord,您將重新分配迭代器變量項目。

我不同意UpdateRecord(item,5)以任何方式無法讀取 - 但如果它讓你感覺好一些,擴展方法可能會使它更清晰地表明你正在改變項目的內容。

static void Update(this Record item, int value) { 
    // do logic 
} 

foreach (Record item in RecordList) { 
    item.Update(5); 
}