Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何访问ArrayList中的结构? 可能是类型化的问题(在C++中,STL的所有内容都会通过STD::向量,不会出现问题)。_C#_.net - Fatal编程技术网

C#:如何访问ArrayList中的结构? 可能是类型化的问题(在C++中,STL的所有内容都会通过STD::向量,不会出现问题)。

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

我有一个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.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
    • 使用泛型
      列表
      而不是
      ArrayList
      ,除非您使用的平台不支持泛型(microframework或.NET 1.1)
    • 要么使
      TextRange
      不可变,要么将其设为类,或者两者兼而有之
    • 使用属性而不是公共字段(有关更多原因,请参阅)
    • 避免使用缩写,我个人会舍弃“I”前缀(我会使用开始、标记、结束、文本)

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


    或者您也可以始终转到
    列表
    ,其中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好得多的选择。我很好奇为什么可变结构是不好的,对于那些也想知道的人,我发现了一个答案: