类似于C#中的UBound

时间:2014-03-23 22:17:28

标签: 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 []' ;&#34 ;.如果我试图创建数组,而不是确定它的大小,那将是有意义的。

代码如下所示。我整个班级都有问题。缺少的是名称空间,使用语句,类def,然后是第一个显示对话框以获取文件名的方法。

任何建议都将不胜感激。

谢谢,Ray

    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的成员来自对象浏览器。

2 个答案:

答案 0 :(得分:0)

我个人会在这种情况下使用LengthCount。例如,我将在您的代码中使用以下内容:

for (int i = 1; i < mySliceTable.get_RTsAt(j).Length; i++)

请注意,在这种情况下,您需要将<=更改为<,原因显而易见。

答案 1 :(得分:0)

你能告诉我们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);

告诉我这是否适合你。