很可能是典型化的问题(在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中,而不是如何从那里获取值.
你有三个问题:
你正在使用可变结构.开始时这是一个坏主意.为什么不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);
Run Code Online (Sandbox Code Playgroud)
但是,我建议:
txtRange为TextRangeList<T>而不是ArrayList除非你以某种方式在一个不支持泛型的平台上工作(微框架或.NET 1.1)TextRange不可变的,要么使它成为一个阶级 - 或者两者兼而有之