以下代码不想编译。我收到一条错误消息:
'System.Collections.Generic.List.Add(string [])的最佳重载方法匹配有一些无效的参数
但我看不出有什么问题。有什么建议吗?
public static List<string[]> ReadFromDelimitedFile (string Path)
{
int i=0;
List<string[]> AllContracts = new List<string[]>();
using (TextFieldParser parser = new TextFieldParser(Path))
{
parser.Delimiters = new string[] { "\t" };
while (true)
{
AllContracts.Add(i)= parser.ReadFields();
if (AllContracts.Add(i) == null)
{
break;
}
i++;
}
}
return AllContracts;
}
答案 0 :(得分:7)
你想:
AllContracts.Add(parser.ReadFields());
答案 1 :(得分:5)
您尝试在Add(int)
上致电List<string[]>
- 然后为结果分配一个值。基本上,这条线以多种方式被打破:
AllContracts.Add(i)= parser.ReadFields();
也许你真的想要:
string[] fields = parser.ReadFields();
if (fields == null)
{
break;
}
AllContracts.Add(fields);
此时,您根本不需要i
- 并且您不会在列表末尾找到一个空条目(这很可能会在以后引起您的问题 - 这肯定是想要以空值终止的列表“。
另外,我建议不要使用PascalCasing作为本地变量名。
答案 2 :(得分:0)
Add
方法不是索引器。您可以使用要添加的数据来调用它,并且不能使用它来从集合中读取数据。
您应该将您解析的值放在变量中,以便在将其添加到集合之前进行检查,这样就不会将空引用添加到集合中:
while (true) {
string[] fields = parser.ReadFields();
if (fields == null) {
break;
}
AllContracts.Add(fields);
}
您还可以在while
:
string[] fields;
while ((fields = parser.ReadFields()) != null) {
AllContracts.Add(fields);
}
答案 3 :(得分:0)
您的while循环可以替换为以下内容:
while(!parser.EndOfData)
{
AllContracts.Add(parser.ReadFields());
}
正如已经提到的,Add
方法没有索引,它将确定下一个项的索引应该是什么单独的;你只需要给它添加实际项目。
此外,您可以使用parser.EndOfData
来确定是否有更多要添加的项目,而不是将ReadFields()
检查为null。它阅读起来容易得多。