質問: new StreamWriter("survey.csv", true, Encoding.UTF8); // ファイルに書き込む file.WriteLine(tempString); // ファイルを閉じる file.Close(); } } ```
回答: 最初にソースが提示されていれば、全然違う答えになっていましたね。 原因は`foreach`ループの中で処理しているからです。 ソースの`foreach`ループでは、RadioButtonコントロールが1個づつ選択されて処理されます。 そのため、その中でCSVを作成して`WriteLine`でファイルに書くと、1個につき1行書かれます。 それでは、質問のように、行方向に出力されることになります。 `foreach`ループの前にstringのList変数を宣言・初期化しておき、`foreach`ループの中では、そのListにTextをAddしていく処理だけ行って、ループを抜けた後でCSVデータ作成とファイル書き込み処理を行うようにしましょう。 なお、最初のLINQを工夫すればコントロール配列ではなく、直接Textの配列が取得できるので、`foreach`ループは不要になります。合わせれば、以下のようになります。 ``` private void radioButton1_CheckedChanged(object sender, EventArgs e) { // 指定した複数のグループ内のラジオボタンでチェックされている物のTextを全部取り出す var RadioButtonCheckedAll_InGroups = new[] { groupBox3, groupBox4, groupBox6, groupBox8, groupBox10, groupBox11, groupBox12, groupBox13, } .SelectMany(g => g.Controls.OfType() .Where(r => r.Checked)) .Select(b => b.Text); // RadioButtonコントロールのTextプロパティだけ抜き出して配列化 // 結果 string tempString = String.Join(",", RadioButtonCheckedAll_InGroups); // 1行のCSVに変換 if (string.IsNullOrWhiteSpace(tempString)) { return; } // ファイルを書き込みモード(追加)で開く StreamWriter file = new StreamWriter("survey.csv", true, Encoding.UTF8); // ファイルに書き込む file.WriteLine(tempString); // ファイルを閉じる file.Close(); } ``` **以下は追加前の内容に対する回答です** 該当の変数(ButtonBase.Text)が オブジェクトの配列(Object])、文字列の配列(string[])、string型を含むIEnumerableのリスト(List)のいずれかならば、[String.Join Method で連結することができます。 以下のようになります。 ``` string tempString = String.Join(",", ButtonBase.Text); ``` それぞれの要素をダブルクォーテーションで囲みたい場合は、以下のようになります。 ``` string tempString = String.Join(",", ButtonBase.Text.Select(s => "\"" + s + "\"")); ``` 変換した文字列変数をStreamWriterで書き出せば良いでしょう。 CSVでもっと色々と汎用的なことをやりたいのならば、高機能のライブラリや事例等が多数ありますので検索してみてください。