【问题标题】:what is the pattern for modifying a collection in C#在 C# 中修改集合的模式是什么
【发布时间】:2010-03-12 12:03:55
【问题描述】:

此类问题的模式(最佳实践)是什么——修改集合中的元素(值)?

条件:

  • 集合的大小没有改变(没有元素被删除或添加)
  • 就地修改

在 C++ 中它既简单又好用,我只是迭代了一个集合并更改了元素。但是在 C# 中迭代​​(使用枚举器)是只读操作(就 C++ 而言,只有 const_iterator 可用)。

那么,如何在 C# 中做到这一点?

示例:具有“1,2,3,4”修改序列将其更改为“1,2,8,9”但不是“1,2,3”或“1,2,3,4, 5"。

【问题讨论】:

标签: c# iterator collections design-patterns enumerator


【解决方案1】:

通常你会通过索引来代替:

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

一个更实用的替代方法是创建一个方法,该方法返回一个 new 集合,其中包含所需的“修改”数据 - 这完全取决于您想要做什么。

【讨论】:

  • 看来这里C++比较灵活,谢谢解答。
【解决方案2】:

实际上这取决于。 readonly 部分适用于迭代器本身。如果您正在迭代对象集合,则可以通过引用更改对象的状态。

对于值类型的集合,您不能在迭代期间更改元素,但在这种情况下,您可以使用常规循环和索引器遍历元素。

【讨论】:

  • 谢谢。第一句话只是部分正确-您事先不知道元素是否不可变。在类的情况下,它的集合是引用的集合——这样你就必须改变引用。并且枚举器不允许你这样做。
  • @macias:迭代变量始终是只读的。但是,如果是引用,则可以修改它指向的实例,但不能更改引用本身。请查看我评论中的链接以了解您的问题。
  • 我完全理解——我的问题是如何让它(循环)看起来更好。在 C++ 中它真的很好,所以在 C# 中它看起来很丑是令人惊讶的。就是这样。
猜你喜欢
  • 2014-01-24
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 2012-05-17
相关资源
最近更新 更多