簡體   English   中英

與C#中的UBound相似

[英]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的成員來自對象瀏覽器。

在這種情況下,我個人將使用LengthCount 因此,例如,我將在您的代碼中使用以下代碼:

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.

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