C#:如何访问ArrayList中的结构? 可能是类型化的问题(在C++中,STL的所有内容都会通过STD::向量,不会出现问题)。
我有一个ArrayList,我想在那里存储一些结构。像C#:如何访问ArrayList中的结构? 可能是类型化的问题(在C++中,STL的所有内容都会通过STD::向量,不会出现问题)。,c#,.net,C#,.net,我有一个ArrayList,我想在那里存储一些结构。像 struct txtRange { public String sText; public String sTag; public int iBeg; public int iEnd; }; ArrayList Ranges = new ArrayList(); txtRange iRange; iRange.sText
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.Count-1]时遇到问题。iEnd:“object”不包含“iEnd”的定义。
如何创建指定类型的ArrayList
类似的问题()让我笑了一下。。。但是,仍然有一个解释是如何向ArrayList中添加结构,而不是如何从中获取值。在我看来,您只需要转换输出
((txtRange)Ranges[Ranges.Count-1]).iEnd
或者使用
List
代替强类型的love。这里有三个问题:
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
- 使用泛型
而不是列表
,除非您使用的平台不支持泛型(microframework或.NET 1.1)ArrayList
- 要么使
不可变,要么将其设为类,或者两者兼而有之TextRange
- 使用属性而不是公共字段(有关更多原因,请参阅)
- 避免使用缩写,我个人会舍弃“I”前缀(我会使用开始、标记、结束、文本)
或者您也可以始终转到
列表
,其中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;
或使用泛型.< /p>“在C++中,STL的所有内容都将通过STD::vector,并且不会出现问题”——签出列表(在Stal.Posith.G泛泛型)中。您可以在其中放置结构,而无需强制转换、装箱和拆箱。除非你真的需要一个异构集合,否则它是比ArrayList好得多的选择。我很好奇为什么可变结构是不好的,对于那些也想知道的人,我发现了一个答案: