很可能是典型化的问题(在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中,而不是如何从那里获取值。
答案 0 :(得分:5)
这里有三个问题:
你正在使用可变结构。开始时这是一个坏主意。为什么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
,除非您正在使用不支持泛型的平台(微框架或.NET 1.1)TextRange
成为不可变的,或使其成为一个类 - 或者可能两者都答案 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;
或使用泛型。