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また、リストの最後に null エントリが残ることもありません (後で問題が発生する可能性が非常に高くなります。null で終わるリストが必要になることは確かに珍しいことです)。 )。

また、ローカル変数名に PascalCasing を使用しないことをお勧めします。

于 2012-09-26T16:41:13.807 に答える
1

while ループは次のように置き換えることができます。

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

前述したように、このAddメソッドはインデックスを取りません。次のアイテムのインデックスが何であるかを独自に判断します。追加する実際のアイテムを指定するだけです。

さらに、nullparser.EndOfDataをチェックするのではなく、追加する項目があるかどうかを判断するために使用できます。ReadFields()それははるかに簡単に読めます。

于 2012-09-26T17:01:17.783 に答える
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 に答える