C#:如何访问ArrayList中的结构?

0 .net c#

很可能是典型化的问题(在C++中使用STL,一切都将通过std :: vector进行,并且不会出现任何问题).

我有一个ArrayList,我想在那里存储一些结构.喜欢

    struct txtRange
    {
        public String sText;
        public String sTag;
        public int iBeg;
        public int iEnd;
    };

    ArrayList Ranges = new ArrayList();   

    txtRange iRange;
    iRange.sText = entityText;
    iRange.sTag = "";
    iRange.iBeg = Ranges.Count > 0 ? Ranges[Ranges.Count - 1].iEnd + 1 : 0;
    iRange.iEnd = iRange.iBeg + tmpstr.Length;
    Ranges.Add(iRange);
Run Code Online (Sandbox Code Playgroud)

实际上,我在访问Ranges时遇到麻烦[Ranges.Count - 1] .iEnd:'object'不包含'iEnd'的定义.应该如何创建指定类型的ArrayList?

类似的问题(如何将对象/结构转换为arraylist?)让我笑了一下......但是,仍有一个解释如何将结构添加到ArrayList中,而不是如何从那里获取值.

Jon*_*eet 5

你有三个问题:

  1. 你正在使用可变结构.开始时这是一个坏主意.为什么不txtRange上课?

  2. 你正在使用公共领域 - 没有封装.

  3. 您正在使用非泛型ArrayList类型,这意味着所有内容都已装箱,而您只有弱类型.

您可以在删除结果时强制转换结果,但如果要更改内容,则必须再次将其放回(因为它是结构,并且每次都被复制).你给出的片段实际上并不需要改变任何东西,但你可能会在某些时候碰到它.这是工作代码中的代码段:

txtRange iRange;
iRange.sText = entityText;
iRange.sTag = "";
iRange.iBeg = Ranges.Count > 0 ? ((txtRange) Ranges[Ranges.Count - 1]).iEnd + 1 
                               : 0;
iRange.iEnd = iRange.iBeg + tmpstr.Length;
Ranges.Add(iRange);
Run Code Online (Sandbox Code Playgroud)

但是,我建议:

  • 重命名txtRangeTextRange
  • 使用泛型List<T>而不是ArrayList除非你以某种方式在一个不支持泛型的平台上工作(微框架或.NET 1.1)
  • 要么TextRange不可变的,要么使它成为一个阶级 - 或者两者兼而有之
  • 使用属性而不是公共字段(有关更多原因,请参阅此处)
  • 避免使用缩写,我个人会抛弃"i"前缀(我使用Start,Tag,End,Text)