[英]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中,但沒有從那里獲取值的方法。
您在這里遇到三個問題:
您正在使用可變結構。 首先,這是一個壞主意。 為什么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
TextRange
不變,或者使它成為一個類-或者可能兩者都 如我所見,您只需要轉換輸出即可。
((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.