本日はC#の小ネタ枠です。
C#でEnumerableを使って数値配列の積集合または和集合を求める方法です。
積集合/和集合
積集合と和集合は集合の関係を表す定義です。
2つの集合が存在するとき、「両方に含まれる要素」の集合が積集合、「少なくとも片方に含まれる要素」の集合が和集合になります。
2つの集合
積集合
和集合
Enumerable.Intersect/Enumerable.Union
Enumerable.IntersectまたはEnumerable.Unionを使って2つのシーケンスから積集合または和集合を求めることができます。
Enumerable.Intersectは2つのシーケンスの積集合を生成します。
learn.microsoft.com
int[] intArray1 = { 5, 3, 9, 7, 5, 9, 3, 7 }; int[] intArray2 = { 8, 3, 6, 4, 4, 9, 1, 0 }; IEnumerable<int> both = intArray1.Intersect(intArray2);
Enumerable.Unionは2つのシーケンスの和集合を生成します。
learn.microsoft.com
int[] intArray1 = { 5, 3, 9, 7, 5, 9, 3, 7 }; int[] intArray2 = { 8, 3, 6, 4, 4, 9, 1, 0 }; IEnumerable<int> union = intArray1.Union(intArray2);
サンプルスクリプト
2つの数値配列から積集合と和集合を求める以下のサンプルスクリプトを作成しました。
・EnumerableIntersectUnionTest.cs
using System.Linq; using UnityEngine; public class EnumerableIntersectUnionTest : MonoBehaviour { void Start() { // 2の倍数の数値型の配列を作成 float[] floatArray1 = new float[] { 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f }; Debug.Log($"floatArray1: {string.Join(", ", floatArray1)}"); // 3の倍数の数値型の配列を作成 float[] floatArray2 = new float[] { 3.0f, 6.0f, 9.0f, 12.0f, 15.0f, 18.0f }; Debug.Log($"floatArray2: {string.Join(", ", floatArray2)}"); // Intersectメソッドを使用して、2つの配列の積集合を取得 float[] intersectResult = floatArray1.Intersect(floatArray2).ToArray(); Debug.Log($"intersectResult: {string.Join(", ", intersectResult)}"); // Unionメソッドを使用して、2つの配列の和集合を取得 float[] unionResult = floatArray1.Union(floatArray2).ToArray(); Debug.Log($"unionResult: {string.Join(", ", unionResult)}"); } }