2

下面的代码不想编译。我收到一条错误消息:

'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;
    }
4

4 回答 4

8

你要:

AllContracts.Add(parser.ReadFields());
于 2012-09-26T16:40:28.130 回答
6

您正在尝试调用Add(int)-List<string[]>然后为结果赋值。基本上,这条线以多种方式被打破:

AllContracts.Add(i)= parser.ReadFields();

也许你真的想要:

string[] fields = parser.ReadFields();
if (fields == null)
{
    break;
}
AllContracts.Add(fields);

在这一点上,你根本不需要i- 而且你不会在列表末尾得到一个空条目(这很可能会在以后给你带来问题 -想要一个以空结尾的列表当然是不寻常的)。

另外,我建议不要对局部变量名使用 PascalCasing。

于 2012-09-26T16:41:13.807 回答
1

Add方法不是索引器。您使用要添加的数据调用它,但不能使用它从集合中读取数据。

您应该将解析的值放入变量中,以便在将其添加到集合之前对其进行检查,这样您就不会将 null 引用添加到集合中:

while (true) {
  string[] fields = parser.ReadFields();
  if (fields == null) {
    break;
  }
  AllContracts.Add(fields);
}

您还可以在以下位置进行分配和检查while

string[] fields;
while ((fields = parser.ReadFields()) != null) {
  AllContracts.Add(fields);
}
于 2012-09-26T16:45:09.007 回答
1

您的 while 循环可以替换为以下内容:

while(!parser.EndOfData)
{
    AllContracts.Add(parser.ReadFields());
}

如前所述,该Add方法不带索引,它会自行计算下一项的索引应该是什么;你只需要给它添加的实际项目。

此外,您可以使用parser.EndOfData来确定是否有更多要添加的项目,而不是检查是否ReadFields()为空。它读起来容易得多。

于 2012-09-26T17:01:17.783 回答