如何在C#</string []>中使用List <string []>

时间:2012-09-26 16:38:49

标签: c# list

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

  

'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 个答案:

答案 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。它阅读起来容易得多。