2

さまざまなforeachループのArrayListのコンテンツを出力しようとしていますが、取得するのはString+System.Collections.ArrayListだけです。

たとえば、次のコード:

ArrayList nodeList = new ArrayList();
foreach (EA.Element element in elementsCol)
{
    if ((element.Type == "Class") || (element.Type == "Component") || (element.Type == "Package"))
    {
         nodeList.Add(element);
    }
    Console.WriteLine("The nodes of MDG are:" + nodeList); //stampato a schermo la lista dei nodi nel MDG finale

そして、私が得る出力は次のとおりです。

The nodes of MDG are:System.Collections.ArrayList

誰かに理由を教えてもらえますか?

4

6 に答える 6

5

の文字列への変換は、表示される出力を生成するnodeList呼び出しだけです。nodeList.ToString()代わりに、配列を繰り返し処理して、個々のアイテムを印刷する必要があります。

または、次を使用できますstring.Join

Console.WriteLine("The nodes of MDG are:" + string.Join(",", nodeList));

ちなみに、ArrayListC#2以降でまだ使用する理由(または言い訳)はありません-レガシーコードを維持していない場合は、List<T>

于 2012-05-16T18:58:30.423 に答える
4

まず第一に、C#でArrayListを使用する正当な理由はありません。少なくとも代わりに使用する必要System.Collections.Generic.List<T>があります。ここでも、より具体的なデータ構造が利用できる場合があります。ArrayListのような型なしコレクションは絶対に使用しないでください。

次に、オブジェクトをConsole.Writeline()に渡すと、オブジェクトの.ToString()メソッドが呼び出されます。

ArrayListは、基本オブジェクト型から継承された.ToString()メソッドをオーバーライドしません。

基本オブジェクトタイプの.ToString()実装は、単にオブジェクトのタイプを出力します。したがって、投稿した動作はまさに期待どおりです。

配列やその他のシーケンスタイプの.ToString()をオーバーライドしないという選択の背後にある理由はわかりませんが、単純な事実は、これで配列内の個々のアイテムを出力する場合は、次のコードを記述する必要があるということです。アイテムを繰り返して、自分で印刷します。

于 2012-05-16T19:00:15.337 に答える
3

値を取得するには、arraylistをループする必要があります...

foreach(var item in nodeList)
{
    Console.WriteLine("The nodes of MDG are:" + item);
}

これは機能します。

更新しました:

nodelistの代わりにelementを使用する

Console.WriteLine("The nodes of MDG are:" + element);
于 2012-05-16T18:58:46.073 に答える
0

次のコードで必要な出力を取得しました。

using System.IO

using (StreamWriter writer = new StreamWriter("C:\\out.txt"))
        {
            Console.SetOut(writer);
         }

Console.WriteLine("the components are:");
        foreach (String compName in componentsList)
        { Console.WriteLine(compName); }

ここで、componentsListは、印刷したい配列リストです。

よろしくお願いします

于 2012-05-24T15:43:02.017 に答える
0
StringBuilder builder = new StringBuilder();
foreach (EA.Element element in elementsCol)
{
    if ((element.Type == "Class") || (element.Type == "Component") || (element.Type == "Package"))
    {
        builder.AppendLine(element.ToString());

    }
 }
 Console.WriteLine("The nodes of MDG are:" + builder.ToString());
于 2012-05-16T18:58:55.400 に答える
0

これはnodeList.ToString()を呼び出します。リスト内の各要素に対してToString()を実行し、それらを結合する方が理にかなっています。

Console.WriteLine("The nodes of MDG are:" + string.Join(", ", nodeList));
于 2012-05-16T19:00:02.513 に答える