簡體   English   中英

C#:如何訪問ArrayList中的結構?

[英]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中,但沒有從那里獲取值的方法。

您在這里遇到三個問題:

  1. 您正在使用可變結構。 首先,這是一個壞主意。 為什么txtRange不是類?

  2. 您正在使用公共字段-無封裝。

  3. 您使用的是非通用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
  • 除非使用某種不支持泛型的平台(微框架或.NET 1.1),否則請使用泛型List<T>而不是ArrayList
  • 無論是TextRange不變,或者使它成為一個類-或者可能兩者都
  • 使用屬性代替公共字段(更多原因請參見此處
  • 避免使用縮寫,我個人會省略“ i”前綴(我會使用“開始”,“標記”,“結束”,“文本”)

如我所見,您只需要轉換輸出即可。

((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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM