繁体   English   中英

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

[英]C#: How to access structs in ArrayList?

可能是类型化问题(在带有STL的C ++中,所有内容都将通过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时遇到麻烦:“对象”不包含“ iEnd”的定义。 如何创建指定类型的ArrayList?

类似的问题( 如何将对象/结构转换为arraylist? )让我有些笑...但是,仍然有一种解释,说明如何将结构添加到ArrayList中,但没有从那里获取值的方法。

您在这里遇到三个问题:

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

但是,我建议:

  • txtRange重命名为TextRange
  • 除非使用某种不支持泛型的平台(微框架或.NET 1.1),否则请使用泛型List<T>而不是ArrayList
  • 无论是TextRange不变,或者使它成为一个类-或者可能两者都
  • 使用属性代替公共字段(更多原因请参见此处
  • 避免使用缩写,我个人会省略“ i”前缀(我会使用“开始”,“标记”,“结束”,“文本”)

如我所见,您只需要转换输出即可。

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

或使用List<txtRange>代替强类型的爱。

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

或者,您也可以始终使用List<T> ,其中t是txtRange路由,因为它无需铸造就可以工作

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

谢谢,问题都可以通过显式强制转换来解决

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

或使用泛型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM