在我学习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的成员来自对象浏览器。
答案 0 :(得分:0)
我个人会在这种情况下使用Length
或Count
。例如,我将在您的代码中使用以下内容:
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);
告诉我这是否适合你。