最初に(メソッドではなく、一般的な意味でZip
)配列を圧縮して、学生をスコアでグループ化する構造にします。
与えられた:
string[][] arrStudentGroup1 = new string[][]{new string[]{"Bob","98"}, new string[]{"Alice","98"}, new string[]{"Charles","78"}, new string[]{"Dariah","99"}};
string[][] arrStudentGroup2 = new string[][]{new string[]{"Bob","98"}, new string[]{"Fiona","98"}, new string[]{"Eve","78"}, new string[]{"Dariah","99"}};
それで:
var zipped1 = arrStudentGroup1.Select(student => new {Name = student[0], Score = student[1]});
var zipped2 = arrStudentGroup2.Select(student => new {Name = student[0], Score = student[1]});
次に交差点を取得します。同じ学生名が1つに含まれていてもスコアが異なる場合、交差点としてカウントされないことに注意してください。それも対処できますが、私はあなたの質問をその場合を望まないと解釈しています。私があなたを間違って読んだ場合は私に知らせてください:
var inter = zipped1.Intersect(zipped2);
これで、とにかくこれを使用するのが理想的です。または、new {Name = student[0], Score = int.Parse(student[1])}
上記を使用して、文字列の代わりに数値を使用することもできます(ほとんどの場合、より便利です)。これは、配列の配列を処理するよりも率直に言って、タイプセーフであることに加えて優れています。それでも、本当に同じ形式のstring []形式にしたい場合は、次のようにします。
var interArray = inter.Select(st => new string[]{st.Name, st.Score});
そして、あなたが本当に、本当にすべてを同じ文字列[] []形式にしたいのなら:
var interArrays = interArray.ToArray();
または、1行の不思議(ほとんどの場合、読みやすさは劣りますが、同じメソッドで他のことが起こっている場合は、1行にクエリを配置すると便利な場合があります):
var interArrays = arrStudentGroup1
.Select(student => new {Name = student[0], Score = student[1]})
.Intersect(
arrStudentGroup2
.Select(student => new {Name = student[0], Score = student[1]})
).Select(st => new string[]{st.Name, st.Score}).ToArray()
出力:
{"Bob", "98"},{"Dariah", "99"}
IEqualityComparer<string[]>
編集:または、次のように定義します。
public class StudentComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if(ReferenceEquals(x, y))
return true;
if(x == null || y == null)
return false;
return x.SequenceEqual(y);
}
public int GetHashCode(string[] arr)
{
return arr == null ? 0 : arr.Select(s => s == null ? 0 : s.GetHashCode()).Aggregate((x, y) => x ^ y);
}
}
次に、それを直接使用します。
var intersection = arrStudentGroup1.Intersect(arrStudentGroup2, new StudentComparer());
同じ出力を提供します。本当に単純ですが、配列がオブジェクトとして使用されているのを見たときの私の本能は、できるだけ早く実際のオブジェクトに配列を取り込むことでした。実際、それは悪い本能ではありません。他のこともはるかに簡単になります。