2010-03-12 81 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