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

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

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

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

LINQ

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

Q&A

解決済

1回答

1998閲覧

2つの配列の差分要素の取得。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

LINQ

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

0グッド

0クリップ

投稿2018/12/01 16:35

編集2018/12/02 07:49

前提・実現したいこと

2つの配列の差分要素をLinqを使って取得する方法のご教示をお願い致します。
(Linqを使うのがおそらく1番スマートもしくは簡潔に書けると思っていますが、違っていたらご指摘下さい。)

試したこと

下記の差分をとって、1,3,5,6,8となるように取得したいです。

C#

1 void Start () { 2 int[] arr1 = new int[]{1,2,3,4,5}; 3 int[] arr2 = new int[]{2,4,6,8}; 4 IEnumerable<int> concats = arr1.Concat(arr2); 5 IEnumerable<int> unique = concats.Distinct(); 6 unique.ToList().ForEach(x=>Debug.Log(x)); 7 }

Distinctで重複してる要素を削除できるかと思ったら、ユニークにするだけだったので、差分が取れませんでした。
そもそもConcatしようとしている時点で間違っているのかもしれません。

あと、uniqueの要素を回すのにForEachを使おうとしたら、使えなかったので、間にToList()をかましましたが、
IEnumerableを回す方法はこれが最適ですか?もっと簡潔に書ける方法がありましたらご教示お願い致します。

ご回答を受けてメモ。

C#

1 void Start () { 2 int[] arr1 = new int[]{1,2,3,4,5}; 3 int[] arr2 = new int[]{2,4,6,8}; 4 IEnumerable<int> intersect = arr1.Intersect(arr2); //2,4 5 IEnumerable<int> union = arr1.Union(arr2); //1,2,3,4,5,6,8 6 IEnumerable<int> xor = union.Except(intersect); //1,3,5,6,8 7 xor.ToList().ForEach(x=>Debug.Log(x)); 8 }

UnionとConcatの違いは、
Union(和集合)は、コレクション同士を連結する。ただし、重複するデータがある場合は1件のみに絞られる。
Concat(和集合)は、コレクション同士を連結する。ただし、重複するデータがある場合もそのまま連結する(Union Allのイメージ)。

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

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

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

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

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

guest

回答1

0

ベストアンサー

LINQの集合演算 - Qiitaで紹介されている「排他的論理和」のやり方はいかがでしょうか?

投稿2018/12/01 16:46

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2018/12/02 07:51

ご回答ありがとうございます。 ご提示いただいたコードで実装できました。 Concatも和集合だったんですね。 あと、IEnumerable型をそのまま回せるメソッドは無いですか? ToList()のように何かに変換してからでないと回せないですか?
Bongo

2018/12/02 10:43

普通「和集合」と言われたら、重複を排除するUnionの方を指すと思った方が無難な気がします。 通常、集合は要素の重複があっても同一視するらしいので、Concatしたものも和集合と言っていいのかもしれません。重複も考慮した集合は多重集合とか言うそうで、多重集合同士の和だと各要素の重複度はそれぞれの多重集合での重複度のうち大きい方になるらしく、これまたConcatとはちょっと違うみたいですね。Concatのように重複度が2つの和になる演算は「直和」とか「結合」というっぽいですが...集合論をちゃんと学んだわけではないので認識を間違っているかもしれません。ご注意ください。 ForEachについては、http://blog.xin9le.net/entry/2013/03/03/123246 や、そのサイトでも言及されている https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/ によれば、自前で拡張メソッドを作ることになるようです。 Eric Lippertさんの記事や https://qiita.com/chocolamint/items/d29d699ce27bcf685154 のようにForEachメソッドについて否定的な意見もありますが、多少のデメリットも考慮した上で、一行で書けるようにできるメリットをとるというのもアリだと思います。
退会済みユーザー

退会済みユーザー

2018/12/02 12:12

ご回答ありがとうございます。 「和集合」はUnionと無難に覚えたいと思います。 ForEachにそのようなデメリットがあったのですね。 今のところ、自分が使う分にはデメリットになるケースは特殊な感じがするので、 IEnumerable型を回したいときは、ToList()してForEachで回すという書き方をしていきたいと思いました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問