我的课程有多个public accessor
,其中一个是List<String> p {get; set;}
我的问题是,这个:
在实例化这个类的代码中,我循环遍历一个可以包含多行p的字符串,因此对于p的每一行我想将它添加到List<String> p
所以我试过这个:
instancenam.p.AddRange(string.Split(new char[] {':',':'})[2]);
它让我获得字符串中的第二组值,如:23A:TETCGR
当我运行代码时,我得到以下两个错误:
错误1:
'System.Collections.Generic.List.AddRange(System.Collections.Generic.IEnumerable)'的最佳重载方法匹配有一些无效的参数
错误2:
参数1:无法从'string'转换为'System.Collections.Generic.IEnumerable'*
我用Google搜索,但对回复感到困惑; - )
foreach(字符串str in lines) { //需要检查长度是否大于3。 if(str!=“4:”&amp;&amp; str!=“”) { //存储标签名称
if (str.StartsWith(":"))
{
tag = str.Split(new char[] { ':', ':' })[1];
SavedTag = tag;
switch (MessageType)
{
// Tag 13C Time Indication
if (tag == "13C")
{
mt202.tag13C.Add(str.Split(new char[] { ':', ':' })[2]);
}
break;
}
好的,如此命名为推荐我现在有以下内容。我的字符串包含多个标记:13C:
使用上面的Add i get对象引用未设置为对象的实例
编辑:
public class MT202
{
public string tag20 { get; set; }
public string tag21 { get; set; }
public List<String> tag13C { get; set; }
public string tag32A { get; set; }
public string tag33B { get; set; }
}
// Code below is from the calling class
if (tag == "13C")
{
char[] delimiters = new char[] { ':', ':' };
string[] splitValues = str.Split(delimiters);
string singleValue = splitValues[2];
List<string> mt202.tag13C = new List<string>();
mt202.tag13C.Add(singleValue);
// mt202.tag13C.Add(str.Split(new char[] { ':', ':' })[2]);
}
答案 0 :(得分:4)
让我们分解这一行:
instancenam.p.AddRange(string.Split(new char[] {':',':'})[2]);
我将假设string
部分实际上是变量的名称(string
不是有效的标识符)。我将在下面称之为text
。
扩展代码如下所示:
char[] delimiters = new char[] {':',':'};
string[] splitValues = text.Split(delimiters);
string singleValue = splitValues[2];
List<string> list = instancenam.p;
list.AddRange(singleValue);
这会产生相同的错误,因为您正在调用AddRange
,这意味着需要集合值 - 但您只提供单价值。如果您只想添加单个值,请使用Add
:
instancenam.p.Add(text.Split(new char[] {':',':'})[2]);
我建议将代码分解为 bit 更像上面的代码 - 也许不会分解到那么远,但至少有一点点。 (你可以为分隔符设置一个只读静态字段,一开始。)
此外,我强烈建议您将属性从p
重命名为更有意义的,在PascalCase中符合.NET命名约定。
编辑:现在已经使用以下内容编辑了帖子:
使用上面的Add i get对象引用未设置为对象的实例
这表明mt202
或mt202.tag13C
是null
引用,但我们无法分辨哪一个。你应该用调试器来研究它。