[英]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中,但没有从那里获取值的方法。
您在这里遇到三个问题:
您正在使用可变结构。 首先,这是一个坏主意。 为什么txtRange
不是类?
您正在使用公共字段-无封装。
您使用的是非通用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
List<T>
而不是ArrayList
TextRange
不变,或者使它成为一个类-或者可能两者都 如我所见,您只需要转换输出即可。
((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.