[英]Something similar to UBound in C#
在學習C#的過程中,我已經用Vb和C#編寫了一個小項目的代碼。 我已經取得了進步,但是在嘗試實現一些在Vb中容易實現的問題時遇到了問題。 該例程從色譜系統讀取結果文件。 當我嘗試確定已處理峰的陣列大小時,會發生問題,這些峰的大小會根據各個峰的積分限制而變化。 我的目標是將它們填充到列表中,然后將其用於在XY圖上顯示峰。 我進行了搜索,通常提供兩個選項,但是它們對我不起作用,但是也許我還缺少其他東西。 我嘗試使用GetUpperBounds屬性
nPoints = mySliceTable.get_RTsAt(j).GetUpperBound(0);
並引用Microsoft.VisualBasic並使用類似
nPoints = Information.UBounds(mySliceTable.get_RTsAt(j);
無論哪種情況,我都會收到類似“無法將類型為'System.Double [*]'的對象轉換為類型為'System.Double []'的對象”之類的錯誤。 如果我試圖創建數組而不是確定其大小,那將是有意義的。
代碼如下所示。 我在粘貼整個課程時遇到問題。 缺少的是名稱空間,使用語句,類def,然后是顯示對話框以獲取要讀取的文件名的第一個方法。
任何建議,將不勝感激。
謝謝,雷
private void readFile(string file)
{
PLCirrusResults myRstFile = new PLCirrusResults();
myRstFile.Load(file);
IPLCirrusRstSampleInfo mySampleInfo ;
IPLCirrusRstSliceTable mySliceTable ;
IPLCirrusRstProcessedPeaks myProcessedPeaks;
mySampleInfo = (IPLCirrusRstSampleInfo)myRstFile;
mySliceTable = (IPLCirrusRstSliceTable)myRstFile;
myProcessedPeaks = (IPLCirrusRstProcessedPeaks)myRstFile;
// read the sample info header
string sampleName = mySampleInfo.SampleName.ToString();
double conc = Convert.ToDouble(mySampleInfo.Concentration);
double injVol = Convert.ToDouble(mySampleInfo.InjectionVolume);
// read Slice Table
int nPeaks = Convert.ToInt32(mySliceTable.NumberOfSliceTablePeaks);
int nPoints = 0;
IList<double> rTs = new List<double>();
List<double> sConcs = new List<double>();
List<double> normHts = new List<double>();
List<double> responses = new List<double>();
for (int j = 1; j <= nPeaks; j++)
{
nPoints = mySliceTable.get_RTsAt(j).GetUpperBound(0);
for (int i = 1; i <= nPoints; i++)
{
rTs.Add(mySliceTable.get_RTsAt(j)(i));
responses.Add(mySliceTable.get_ResponsesAt(j)(i));
normHts.Add(mySliceTable.get_NormalisedHeightsAt(j)(i));
sConcs.Add(mySliceTable.get_ConcentrationsAt(j)(i));
}
}
string msg = String.Format("The sample is: {0}", sampleName);
MessageBox.Show(msg, "file Info");
}
}
補充:很抱歉耽擱,這是一個漫長的故事。
堆棧跟蹤:
[External Code]
ElastGPCAnalysis.exe!GPC.Model.CirrusFiles.readFile(string file)` Line 71 -> this is the line with the GetUpperBounds(0);
ElasttGPCAnalysis.exe!GPC.Models.CirrusFiles.openFile()` Line 38
ElastGPC.exe!GPC.GPCViewModel.btnLoadSample()` Line 34
[External Code]
然后調用Caliburn.micro。
為了回答有關如何定義get_RTsAt的問題。 再次粘貼屏幕快照會更容易,但是我還不能。 所以我會輸入我能輸入的。
我要引用的dll在許多可用接口之一中稱為PCLGRAMLib.dll和IPLCirrusRstSliceTable。 動態的get_RTsAt(int Peak)PLCGRAMLib.IPLCirrusRstSliceTable的成員來自對象瀏覽器。
在這種情況下,我個人將使用Length
或Count
。 因此,例如,我將在您的代碼中使用以下代碼:
for (int i = 1; i < mySliceTable.get_RTsAt(j).Length; i++)
請記住,在這種情況下,您需要更改<=
只是<
出於顯而易見的原因。
您能告訴我們get_RTsAt的聲明嗎?
如果是一維的,C#支持導出為矢量數組類型的元數據。 但是,如果您設計的數組非零,則可能會遇到問題。
如果您是表示get_RTsAt的庫的作者,請嘗試使其結果類型為Array,而不是非零數組類型。
數組的矢量化設計(根據定義,如果一維或SD,數組的定義保證是零索引的)存在通用中間語言操作碼,這些操作碼可以優化對此類數組的訪問,從而可以鼓勵使用從零開始的代碼,或向量,數組。
如果我的預感是正確的,那么您遇到的問題是C#試圖解析元數據,但是它沒有這樣做。 C# 永遠不會導出非零單維數組的類型,在編寫編譯器的測試中,我遇到了嘗試與SD非零數組互操作的問題。 這可能是您收到的錯誤的線索,即: Unable to cast object of type 'System.Double[*]'to type 'System.Double[]'
的內容。*是您的提示,並向您顯示外觀出來。
編輯 -由於您無權訪問原始源,請嘗試以下操作:是否可以嘗試通過以下方式將get_RTsAt的結果強制轉換為Array:
var rts_at = (Array)(Object)mySliceTable.get_RTsAt(j);
nPoints = rts_at.GetUpperBounds(0);
並告訴我這是否適合您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.