2010-03-12 16 views
1

這種問題的模式(最佳實踐)是什麼 - 修改集合中的元素(值)?在C#中修改集合的模式是什麼

條件:

集合的
  • 尺寸未改變(不元素被刪除或添加)
  • 修飾是就地

在C++中它很容易和漂亮的,我只是通過集合迭代並更改元素。但在C#中迭代(使用枚舉器)是隻讀操作(就C++而言,只有const_iterator可用)。

那麼,如何在C#中做到這一點?

示例:具有「1,2,3,4」修改的序列將其更改爲「1,2,8,9」,但不是「1,2,3」或「1,2,3,4」 ,5「。

+0

相關問題http://stackoverflow.com/questions/1538301 – 2010-03-12 12:17:43

回答

5

通常你會通過索引而不是去:

for (int i = 0; i < foo.Length; i++) 
{ 
    if (ShouldChange(foo[i])) 
    { 
     foo[i] = GetNewValue(i); 
    } 
} 

功能更強大的替代方案是創建返回集合包含所需要的「修改」數據的方法 - 這一切都取決於什麼你想要做的。

+0

所以它似乎在這裏C + +更靈活,謝謝你的答案。 – greenoldman 2010-03-12 12:43:10

1

其實這取決於。 readonly部分適用於迭代器本身。如果迭代一組對象,則可以通過引用更改對象的狀態。

對於值類型的集合,您不能在迭代過程中更改元素,但在這種情況下,您可以使用常規循環和索引器運行元素。

+0

謝謝。第一句話只是部分是真的 - 你事先並不知道元素是不可變的。在收集它的類的情況下,是一個引用的集合 - 這種方式你必須改變引用。而枚舉器不會讓你這樣做。 – greenoldman 2010-03-12 12:46:54

+0

@macias:迭代變量總是隻讀的。但是,如果它是引用,則可以修改它指向的實例,但不能更改引用本身。請參閱我的評論中的鏈接以瞭解您的問題。 – 2010-03-12 12:57:38

+0

我完全理解 - 我的問題是如何(循環)看起來更好。在C++中它非常好,所以令人驚訝的是在C#中它看起來很醜。就這樣。 – greenoldman 2010-03-15 10:36:53

相關問題