【问题标题】:Modify contents in foreach修改foreach中的内容
【发布时间】:2010-10-26 04:00:01
【问题描述】:

我倾向于使用结构的 ArrayLists。然后很容易用 foreach 循环遍历列表。

我遇到的问题是我不能使用 foreach 来修改结构内容,而必须使用 for 和混乱的类型转换。

((dataStructure)files[x]).name = here;

有没有更整洁的方法?

【问题讨论】:

    标签: c# arraylist structure casting


    【解决方案1】:

    是的,有:不要使用无类型的ArrayList,这些类型已被弃用,取而代之的是System.Collections.Generic 中的泛型类型。在你的情况下:List<T>

    您仍然不能将它与foreach 循环结合使用来修改结构值,但至少您不必强制转换。

    【讨论】:

    • 列表看起来确实是个好主意
    • 如果你因为某种原因被你的 ArrayLists 卡住了(它们被一些你无法控制的 API 返回)然后使用 ArrayList 的 Cast 扩展方法将它们转换成一个 IEnumerable。 IEnumerable foo = foo1.Cast();
    【解决方案2】:

    我知道这听起来很简单,但 just say no to mutable value types

    他们几乎是解决问题的正确方法。有非常少数例外,但类几乎总是要走的路。

    此外,如果您真的在使用 ArrayList,那么您已经产生了拆箱成本...(正如 Konrad 所说,如果您可以使用 .NET 2.0,那么请使用泛型。)

    如果您真的坚持使用可变结构,请使用for 循环而不是foreach。但是,无论如何,请换班。

    【讨论】:

    • 乔恩...我认为你应该在每一篇关于可变类型的文章中加入免责声明:D
    • 我需要存储我发现的所有主机的各种详细信息,并且我需要能够循环浏览和修改它们。我应该怎么做?
    • 使用类而不是结构。
    • 有一个类的实例列表。
    • 那我就开始做吧。我认为结构与类没有什么不同,因为它们看起来非常相似。
    【解决方案3】:

    使用ArrayList通用版本:List<DataStructure>

    这样事情看起来好多了:

    files[x].name = here;
    

    【讨论】:

      【解决方案4】:

      是的,在某些情况下List <T> 也没有用。在这些情况下,手册中最古老的技巧起作用了。而不是foreach,你应该使用while循环:

      while (listItem.Count >0)
      {
      //do operation with 0th element of List Item always like
       deletefunc(lisItem[0]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        相关资源
        最近更新 更多