質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

1077閲覧

2つのリストからどちらにも無い値を出力したい

AMK

総合スコア765

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/02/28 13:35

お世話になります。

色々調べて、出来る限りのコードは書いてみたのですが思うような結果が得られず質問させていただきます。

具体的には、
リストA(CSV)
1,2,5,8,9
リストB(CSV)
1、3、7、8、9

出力させたい結果
2,5,3,7

若しくは
3,7

上記のように出力させたいです。

現状のコードでは
エラーは出ず終了するのですが
リストAのデータがそのまま出力されてしまう状態です。

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 string text1 = File.ReadAllText(textBox1.Text); 4 string text2 = File.ReadAllText(textBox2.Text); 5 string text3 = textBox3.Text; 6 List<string> list1 = new List<string>() { text1 }; 7 8 List<string> list2 = new List<string>() { text2 }; 9 10 //textBox3.Text=string.Join(",", list1.Except(list2)); 11 string outcsv = string.Join(",", list1.Except(list2)); 12 File.WriteAllText(textBox3.Text+"\\outfile.csv", outcsv); 13 } 14 15 private void button2_Click(object sender, EventArgs e) 16 { 17 // OpenFileDialogを表示 18 OpenFileDialog OpenFileDialog = new OpenFileDialog(); 19 OpenFileDialog.Title = "ファイルを保存する"; // ダイアログタイトル 20 OpenFileDialog.InitialDirectory = @"C:\"; // 初期のディレクトリ 21 OpenFileDialog.FileName = @"hoge.csv"; // デフォルトファイル名 22 OpenFileDialog.Filter = "Text files|*.csv"; // フィルタ 23 DialogResult result = OpenFileDialog.ShowDialog(); 24 25 if (result == DialogResult.OK) 26 { 27 //「保存」ボタンクリック時の処理 28 //MessageBox.Show("ファイル名:{0}", OpenFileDialog.FileName); 29 textBox1.Text = OpenFileDialog.FileName; 30 } 31 else if (result == DialogResult.Cancel) 32 { 33 //「キャンセル」ボタンや「×」ボタンクリック時の処理 34 MessageBox.Show("「キャンセル」ボタンまたは「×」ボタンが選択されました。"); 35 } 36 } 37 38 private void button3_Click(object sender, EventArgs e) 39 { 40 // OpenFileDialogを表示 41 OpenFileDialog OpenFileDialog = new OpenFileDialog(); 42 OpenFileDialog.Title = "ファイルを保存する"; // ダイアログタイトル 43 OpenFileDialog.InitialDirectory = @"C:\"; // 初期のディレクトリ 44 OpenFileDialog.FileName = @"hoge.csv"; // デフォルトファイル名 45 OpenFileDialog.Filter = "Text files|*.csv"; // フィルタ 46 DialogResult result = OpenFileDialog.ShowDialog(); 47 48 if (result == DialogResult.OK) 49 { 50 //「保存」ボタンクリック時の処理 51 //MessageBox.Show("ファイル名:{0}", OpenFileDialog.FileName); 52 textBox2.Text = OpenFileDialog.FileName; 53 } 54 else if (result == DialogResult.Cancel) 55 { 56 //「キャンセル」ボタンや「×」ボタンクリック時の処理 57 MessageBox.Show("「キャンセル」ボタンまたは「×」ボタンが選択されました。"); 58 } 59 } 60 61 private void button4_Click(object sender, EventArgs e) 62 { 63 //FolderBrowserDialogクラスのインスタンスを作成 64 FolderBrowserDialog fbd = new FolderBrowserDialog(); 65 66 //上部に表示する説明テキストを指定する 67 fbd.Description = "フォルダを指定してください。"; 68 //ルートフォルダを指定する 69 //デフォルトでDesktop 70 fbd.RootFolder = Environment.SpecialFolder.Desktop; 71 //最初に選択するフォルダを指定する 72 //RootFolder以下にあるフォルダである必要がある 73 fbd.SelectedPath = @"C:\Windows"; 74 //ユーザーが新しいフォルダを作成できるようにする 75 //デフォルトでTrue 76 fbd.ShowNewFolderButton = true; 77 78 //ダイアログを表示する 79 if (fbd.ShowDialog(this) == DialogResult.OK) 80 { 81 //「保存」ボタンクリック時の処理 82 //MessageBox.Show("ファイル名:{0}", OpenFileDialog.FileName); 83 textBox3.Text = fbd.SelectedPath; 84 } 85 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/03/01 08:33

「どちらか一方にしか含まれていない」あるいは「Aに含まれているがBには含まれていない」という話なのであれば,タイトルの > どちらにも無い という書き方は間違いだよね. (これだと「AにもBにも含まれていない」という意味になるよね)
guest

回答5

0

自己解決

沢山の回答ありがとうございます!!

自己解決しました!

そもそも、CSVからデータを読み込むときにReadAllTextを使っておりデータを見たら改行コードとデータが入っていたので配列に入れるように変更(ReadAllLines)
配列からリストに変換して、そこからはコード通りでした!

投稿2022/03/02 14:56

AMK

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

new List<string>{"1,2,3,4,5"}としても、要素が1つだけ("1,2,3,4,5")のリストができる。ということがわかっていないのかと思います。
Splitメソッドを使って、,で分割しましょう。

C#

1 string text1 = "1,2,5,8,9"; 2 string text2 = "1,3,7,8,9"; 3 4 var text3 = string.Join(", ",text2.Split(',').Except(text1.Split(','))); 5 6 System.Console.WriteLine(text3); // 3, 7

必要があれば、空白を消したり数値型にパースしたりしてください。

投稿2022/03/01 01:04

編集2022/03/01 02:46
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問文から「text1には"1,2,5,8,9"、text2には"1,3,7,8,9"が入っている。1文字ずつ処理し、差分を出力したい」と理解しました。

List<string> list1 = new List<string>() { text1 };

これだと、list1"1,2,5,8,9"の要素1つを持つListになります。デバッガで確認してみてください。

Stringを1文字ずつ処理するには、ToCharArrayが使えます。

c#

1char[] list1 = text1.ToCharArray();

String.ToCharArray メソッド (System) | Microsoft Docs

他にも修正が必要ですが、コードを書いてみて、詰まったらまた質問してください。

追記です。

訂正します。ToCharArrayでは、カンマが含まれてしまいます。

c#

1string text1 = "1,2,5,8,9"; 2char[] list1 = text1.ToCharArray(); 3foreach (var c in list1) { 4 Console.WriteLine(c); 5} 6 7/* 81 9, 102 11, 125 13, 148 15, 169 17*/

他の回答にあるとおり、Splitを使う方がいいと思います。

c#

1string text1 = "1,2,5,8,9"; 2string[] list1 = text1.Split(','); 3foreach (var s in list1) { 4 Console.WriteLine(s); 5} 6 7/* 81 92 105 118 129 13*/

投稿2022/02/28 19:59

編集2022/03/01 05:41
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すっごい単純に,
処理対象としたい文字群に関して出現回数を数えて1回だけのやつを集めて結果とする.

C#

1static void Main() 2{ 3 string text1 = "1,2,5,8,9"; 4 string text2 = "1,3,7,8,9"; 5 6 {//とりあえず処理対象が '0' ~ '9' の10種類の文字なのだとして 7 var Counters = new byte[10]; 8 foreach( char c in text1+text2 ) 9 { 10 int code = (int)c; 11 if( (int)'0' <= code && code <= (int)'9' ) 12 { ++Counters[ code - (int)'0' ]; } 13 } 14 Console.WriteLine( 15 string.Join( 16 ",", 17 Enumerable.Range(0,10) 18 .Where( i => (Counters[i]==1) ) 19 .Select( i => (char)( i+(int)'0' ) ) 20 ) 21 ); 22 } 23}

投稿2022/03/01 01:31

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/03/01 01:32

> 出力させたい結果 > 2,5,3,7 とは表示順序が違うけど.
guest

0

コード

csharp

1using System; 2using System.Collections.Generic; 3 4class Program 5{ 6 static void Main(string[] args) 7 { 8 List<int> a = new List<int> { 1, 2, 5, 8, 9 }; 9 List<int> b = new List<int> { 1, 3, 7, 8, 9 }; 10 11 foreach (int i in a) 12 { 13 b.RemoveAll(x => x == i); 14 } 15 16 foreach (int i in b) 17 { 18 Console.WriteLine(i); 19 } 20 } 21}

結果

text

13 27

投稿2022/02/28 14:41

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問