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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

2回答

1314閲覧

重複は残す差集合の取り方

koz555

総合スコア5

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

1グッド

0クリップ

投稿2022/04/07 12:58

編集2022/04/07 13:28

List<int> list1 { 1, 2, 3, 1, 3 }
//このリストに存在しない要素を抜き出す
List<int> list2 { 3, 4, 5 }
list1 - list2の結果の求め方について質問です。

1,2,1,3のリストとなる方法を教えていただけないでしょうか
list1.Except(list2)
とした場合、重複が排除されてしまい、
1,2
となってしまいます。
foreachで回すのも一致したらlist.Remove というのも試したりしていますが、同じような結果になってしまって、分からなくなってしまいます。

list2 - list1の場合は4,5のリストとなってほしいです。

List<int> list1 { 4, 3}
List<int> list2 { 3, 4, 5 }
この場合
list1 - list2の場合、空のリストとなり、
list2 - list1の場合、5 のリスト

となって欲しいです。

TN8001👍を押しています

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

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

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

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

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

Zuishin

2022/04/07 13:01

1, 2, 1, 3 ではなく、1, 2, 1 ではありませんか?
koz555

2022/04/07 13:07

いえ、1.2.3.1が希望になります。 同じ値だとしても、比較先にある数の分だけ除いた形が欲しいです。 一度だけ差を取る感じです。
Zuishin

2022/04/07 13:09

質問とまた数字が変わっています。
koz555

2022/04/07 13:11

すみません、質問通り、1,2,1,3です。
Zuishin

2022/04/07 13:46

list1 から取り除くのは Where でできます。 マッチした際に list2 からその値を取り除けばいいでしょう。
episteme

2022/04/07 13:47

双方あらかじめソートしておくことを許すなら、端から順に比較すれば楽に見つかるんだけども...
koz555

2022/04/07 13:57

事前にソートしておいても問題ありません。 結果も並び順は問いません。 ソートやWhereで考えていますが、 端から順とはどのようにするのでしょうか?forのindexを最大から比較、という事でしょうか
episteme

2022/04/07 14:10

回答しました
guest

回答2

0

ベストアンサー

foreachで回すのも一致したらlist.Remove というのも試したりしていますが、同じような結果になってしまって、分からなくなってしまいます。

Removeは最初に出現したものいっこだけ削除のはずですが、逆にどういうコードを書いているんでしょうか?
List<T>.Remove(T) メソッド (System.Collections.Generic) | Microsoft Docs

cs

1{ 2 // list2を順に回しlist1に最初に出現したものを削除 3 var list1 = new List<int> { 1, 2, 3, 1, 3 }; 4 var list2 = new List<int> { 3, 4, 5 }; 5 foreach (var i in list2) 6 { 7 list1.Remove(i); 8 } 9 Console.WriteLine(string.Join(", ", list1)); // 1, 2, 1, 3 10} 11{ 12 var list1 = new List<int> { 1, 2, 3, 1, 3 }; 13 var list2 = new List<int> { 3, 4, 5 }; 14 foreach (var i in list1) 15 { 16 list2.Remove(i); 17 } 18 Console.WriteLine(string.Join(", ", list2)); // 4, 5 19} 20 21{ 22 // list1の中でlist2から削除できなかったものだけ抽出 23 var list1 = new List<int> { 1, 2, 3, 1, 3 }; 24 var list2 = new List<int> { 3, 4, 5 }; 25 var list = list1.Where(x => !list2.Remove(x)).ToList(); 26 Console.WriteLine(string.Join(", ", list)); // 1, 2, 1, 3 27} 28{ 29 var list1 = new List<int> { 1, 2, 3, 1, 3 }; 30 var list2 = new List<int> { 3, 4, 5 }; 31 var list = list2.Where(x => !list1.Remove(x)).ToList(); 32 Console.WriteLine(string.Join(", ", list)); // 4, 5 33}

LINQタグもあるのでLINQ版もやりましたが、副作用があるのは個人的には嫌ですね^^;

投稿2022/04/07 14:32

編集2023/07/30 06:02
TN8001

総合スコア9321

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

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

koz555

2022/04/07 15:12

出来ました・・・助かりました・・・Linq版の方が短いので使いたくなりましたが副作用は良くないと確かによく聞くのでforeach版で行きます。 無条件にRemoveを流せば良かったんですね。。。 ここを色々と条件をつけて一致した時のみRemoveしようとして余計な混乱し、どう書けばいいのか分からなくなっていました。
guest

0

双方あらかじめソートしておくことを許すなら、端から順に比較すれば楽に見つかるんだけども...

やってみた:

C#

1using System.Collections.Generic; 2 3public class foo { 4 public static void Main() { 5 List<int> list1 = new List<int> { 1, 2, 3, 1, 3 }; 6 List<int> list2 = new List<int> { 3, 4, 5 }; 7 8 list1.Sort(); 9 list2.Sort(); 10 11 int n1 = 0; 12 int n2 = 0; 13 14 while ( n1 < list1.Count && n2 < list2.Count ) { 15 if ( list1[n1] < list2[n2] ) { 16 Console.WriteLine(list1[n1]); 17 ++n1; 18 } else { 19 if ( list1[n1] >= list2[n2] ) { 20 ++n1; 21 } 22 ++n2; 23 } 24 } 25 while ( n1 < list1.Count ) { 26 Console.WriteLine( list1[n1] ); 27 ++n1; 28 } 29 } 30}

投稿2022/04/07 14:09

episteme

総合スコア16614

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

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

koz555

2022/04/07 15:15

ありがとうございます! よく思いつきますね・・・すごいです。 ただ、Remove()をよく理解出来ていませんでした。申し訳ありませんがRemoveの方で目的の動作が確認出来ましたので、今回はそちらをベストアンサーとしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問