C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: LIST内容をファイル出力したい


(過去ログ 148 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■86494 / inTopicNo.1)  LIST内容をファイル出力したい
  
□投稿者/ kirin (1回)-(2018/02/06(Tue) 19:10:28)

分類:[C#] 

初めまして。プログラミング初心者です。
list内容をテキストファイルに出力したいと思って以下のコードを書きました。
実行してコンソールから適当にカレーやラーメンを入力してもファイルの中が
System.Collections.Generic.List`1[System.String]
と記載されてしまします。

どういった点を修正すればいいでしょうか。
アドバイスをお願いします。

        static void Main(string[] args)
        {
            List<string> lunch = new List<string>();

            while (true)
            {
                string menu;
                Console.WriteLine("終わるにはeを入力");
                menu = Console.ReadLine();
                if (menu == "e")
                {
                    foreach(string e in lunch)
                    {
                        Console.WriteLine(e);
                    }
                    using (StreamWriter wr = new StreamWriter(@"list.text"))
                    {
                        wr.WriteLine(lunch);
                        wr.Close();
                    }
                    break;
                }
                else
                {
                lunch.Add(menu);
                }
             }
        }


引用返信 編集キー/
■86495 / inTopicNo.2)  Re[1]: LIST内容をファイル出力したい
□投稿者/ 774RR (593回)-(2018/02/06(Tue) 19:36:14)
ええっと・・・

List<string> 自体を出力するとそうなるのは仕様通りだと思う(現実装はそのようになっている)。
List<string> の要素を全部、順番に出力したい、のではないかな?
となるとファイル出力のところにも foreach を使うと良いだろう。

とりあえずこの段階でコード提示するのは避けておくのでもうちょっと自分でトライ!

引用返信 編集キー/
■86501 / inTopicNo.3)  Re[2]: LIST内容をファイル出力したい
□投稿者/ ぶなっぷ (166回)-(2018/02/07(Wed) 09:45:44)
もうほとんどできてるので、頑張ってというのは774RRさんも
おっしゃっている通り。
なので、そことは別の部分でアドバイス。
分かりやすいプログラミングみたいな話かな。

今の処理構造はおおざっぱに以下のような感じですよね。
(行数減らすために改行位置変えてます)
while (true)
{
    if (menu == "e") {
        (いろいろ処理1)
        break;
    } else {
        (いろいろ処理2)
    }
}

このうち、(いろいろ処理2)は実際にwhileのループで行いたい
処理であり、(いろいろ処理1)はこの処理を行ったらbreakで
ループを抜けます。

> Console.WriteLine("終わるにはeを入力");
のコメント風に言うなら、
(いろいろ処理1)は終わった後にやりたい処理なわけです。

なので、直感的に書くなら、
while (true)
{
    if (menu == "e") {
        break;
    } else {
        (いろいろ処理2)
    }
}
(いろいろ処理1)

とするだけで、読みやすいコードとなります。

引用返信 編集キー/
■86502 / inTopicNo.4)  Re[2]: LIST内容をファイル出力したい
□投稿者/ kirin (2回)-(2018/02/07(Wed) 10:01:03)
返信ありがとうございます。
いろいろ試したんですが、下記で解決できました。
なんかコードがきれいじゃないんですが、、、

            List<string> lunch = new List<string>();

            while (true)
            {
                string menu;
                Console.WriteLine("終わるにはeを入力");
                menu = Console.ReadLine();

                if (menu == "e")
                {
                    foreach(string e in lunch)
                        Console.WriteLine(e);
                        break;
                    }
                else
                {
                lunch.Add(menu);
                    using (StreamWriter sw = new StreamWriter(@"menu_list.text",true))
                        sw.WriteLine(menu);
                }
            }

解決済み
引用返信 編集キー/
■86503 / inTopicNo.5)  Re[3]: LIST内容をファイル出力したい
□投稿者/ kirin (3回)-(2018/02/07(Wed) 10:07:41)
ぶなっぷさん

ありがとうございます。
参考にさせていただきます。


No86501 (ぶなっぷ さん) に返信
> もうほとんどできてるので、頑張ってというのは774RRさんも
> おっしゃっている通り。
> なので、そことは別の部分でアドバイス。
> 分かりやすいプログラミングみたいな話かな。
>
> 今の処理構造はおおざっぱに以下のような感じですよね。
> (行数減らすために改行位置変えてます)
> while (true)
> {
> if (menu == "e") {
> (いろいろ処理1)
> break;
> } else {
> (いろいろ処理2)
> }
> }
>
> このうち、(いろいろ処理2)は実際にwhileのループで行いたい
> 処理であり、(いろいろ処理1)はこの処理を行ったらbreakで
> ループを抜けます。
>
>>Console.WriteLine("終わるにはeを入力");
> のコメント風に言うなら、
> (いろいろ処理1)は終わった後にやりたい処理なわけです。
>
> なので、直感的に書くなら、
> while (true)
> {
> if (menu == "e") {
> break;
> } else {
> (いろいろ処理2)
> }
> }
> (いろいろ処理1)
>
> とするだけで、読みやすいコードとなります。
>
引用返信 編集キー/
■86504 / inTopicNo.6)  Re[4]: LIST内容をファイル出力したい
□投稿者/ kirin (4回)-(2018/02/07(Wed) 10:51:06)
解決済みが外れたようなので再投稿。


No86503 (kirin さん) に返信
> ぶなっぷさん
>
> ありがとうございます。
> 参考にさせていただきます。
>
>
> ■No86501 (ぶなっぷ さん) に返信
>>もうほとんどできてるので、頑張ってというのは774RRさんも
>>おっしゃっている通り。
>>なので、そことは別の部分でアドバイス。
>>分かりやすいプログラミングみたいな話かな。
>>
>>今の処理構造はおおざっぱに以下のような感じですよね。
>>(行数減らすために改行位置変えてます)
>>while (true)
>>{
>> if (menu == "e") {
>> (いろいろ処理1)
>> break;
>> } else {
>> (いろいろ処理2)
>> }
>>}
>>
>>このうち、(いろいろ処理2)は実際にwhileのループで行いたい
>>処理であり、(いろいろ処理1)はこの処理を行ったらbreakで
>>ループを抜けます。
>>
> >>Console.WriteLine("終わるにはeを入力");
>>のコメント風に言うなら、
>>(いろいろ処理1)は終わった後にやりたい処理なわけです。
>>
>>なので、直感的に書くなら、
>>while (true)
>>{
>> if (menu == "e") {
>> break;
>> } else {
>> (いろいろ処理2)
>> }
>>}
>>(いろいろ処理1)
>>
>>とするだけで、読みやすいコードとなります。
>>
解決済み
引用返信 編集キー/
■86505 / inTopicNo.7)  Re[4]: LIST内容をファイル出力したい
□投稿者/ 774RR (594回)-(2018/02/07(Wed) 10:56:42)
オイラが先生なら 86502 のコードは減点ありだ。だって List (の内容)を出力してないもん。
出力しているのは List に追加する前の内容だ。

でもまずは思ったとおりのことが実装できたというのは大きな進歩で、
なんとなくかっこ悪いとか美しくないとか思うのは更なる改善の入口で、良いことだ。

86502 のコードがかっこ悪いのは「入力」と「出力」が混在していることで、分離するときれいになる。
もう「関数化」学んでいる?学んでいるなら

static void Main()
{
    List<string> lunch = new List<string>();
    InputMenu(lunch); // 入力してリストに追加
    OutputMenu(lunch); // リストを出力
}

のように書いてみよう。これで入力と出力は完全に分離されたわけだ。
その上で InputMenu と OutputMenu を実装してみると良いだろう。

期待されている「出力部」はたぶんこういう実装であろうと思われる。

static void OutputMenu(List<string> lunch)
{
    using (StreamWriter sw = new StreamWriter(@"menu_list.text", true))
    {
        foreach (string s in lunch)
        {
            sw.WriteLine(s);
        }
    }
}

入力部を自分で書いてみると良いだろう。

引用返信 編集キー/
■86515 / inTopicNo.8)  Re[5]: LIST内容をファイル出力したい
□投稿者/ kirin (5回)-(2018/02/07(Wed) 16:36:13)
774RRさん

ありがとうございます。
なるほど。
関数化を意識してコーディングしてみます。



No86505 (774RR さん) に返信
> オイラが先生なら 86502 のコードは減点ありだ。だって List (の内容)を出力してないもん。
> 出力しているのは List に追加する前の内容だ。
>
> でもまずは思ったとおりのことが実装できたというのは大きな進歩で、
> なんとなくかっこ悪いとか美しくないとか思うのは更なる改善の入口で、良いことだ。
>
> 86502 のコードがかっこ悪いのは「入力」と「出力」が混在していることで、分離するときれいになる。
> もう「関数化」学んでいる?学んでいるなら
>
> static void Main()
> {
> List<string> lunch = new List<string>();
> InputMenu(lunch); // 入力してリストに追加
> OutputMenu(lunch); // リストを出力
> }
>
> のように書いてみよう。これで入力と出力は完全に分離されたわけだ。
> その上で InputMenu と OutputMenu を実装してみると良いだろう。
>
> 期待されている「出力部」はたぶんこういう実装であろうと思われる。
>
> static void OutputMenu(List<string> lunch)
> {
> using (StreamWriter sw = new StreamWriter(@"menu_list.text", true))
> {
> foreach (string s in lunch)
> {
> sw.WriteLine(s);
> }
> }
> }
>
> 入力部を自分で書いてみると良いだろう。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -