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

时间:2009-11-12 06:55:51

标签: c# .net

很可能是典型化的问题(在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);

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

类似的问题(How to cast object/structure into arraylist?)让我笑了一下......但是,仍有一个解释如何将结构添加到ArrayList中,而不是如何从那里获取值。

5 个答案:

答案 0 :(得分:5)

这里有三个问题:

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

  2. 您正在使用公共字段 - 没有封装。

  3. 您使用的是非通用ArrayList类型,这意味着所有内容都已装箱,而且您输入的内容较弱。

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

    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);
    

    但是,我建议:

    • txtRange重命名为TextRange
    • 使用通用List<T>代替ArrayList,除非您正在使用不支持泛型的平台(微框架或.NET 1.1)
    • 使TextRange成为不可变的,或使其成为一个类 - 或者可能两者都
    • 使用属性而非公共字段(有关更多原因,请参阅here
    • 避免使用缩写,我会个人抛弃“i”前缀(我使用开头,标签,结尾,文字)

答案 1 :(得分:2)

正如我所看到的,你只需要输出输出。

((txtRange)Ranges[Ranges.Count-1]).iEnd 

或者使用List<txtRange>代替强烈的爱好。

答案 2 :(得分:0)

您需要先将其转换为txtRange类型,然后才能按照指定的方式访问其属性。

或者你总是可以去List<T>,其中t是txtRange路线,因为它可以在不投射的情况下工作

答案 3 :(得分:0)

iRange.iBeg = Ranges.Count > 0 ? ((txtRange)Ranges[Ranges.Count - 1]).iEnd + 1 : 0;

答案 4 :(得分:0)

谢谢,问题可以通过像

这样的显式转换来解决
 iRange.iBeg = Ranges.Count > 0 ? ((txtRange)Ranges[Ranges.Count - 1]).iEnd + 1 : 0;

或使用泛型。