例として、クラス定義から始めましょう。
public class Person
{
public string FirstName;
public string LastName;
public int Age;
public int Grade;
}
ここで、 3つのオブジェクトを含むList<Person>
呼び出しがあると仮定します。people
{"Robby", "Goki", 12, 8}
{"Bobby", "Goki", 10, 8}
{"Sobby", "Goki", 10, 8}
私が探しているのは、次の単一のPerson
オブジェクトを取得する方法です。
{null, "Goki", -1, 8}
ここで、すべてのオブジェクトで同じフィールドは値を保持しますが、複数の値を持つフィールドは無効な値に置き換えられます。
私の最初の考えは次のとおりです。
Person unionMan = new Person();
if (people.Select(p => p.FirstName).Distinct().Count() == 1)
unionMan.FirstName = people[0].FirstName;
if (people.Select(p => p.LastName).Distinct().Count() == 1)
unionMan.LastName = people[0].LastName;
if (people.Select(p => p.Age).Distinct().Count() == 1)
unionMan.Age = people[0].Age;
if (people.Select(p => p.Grade).Distinct().Count() == 1)
unionMan.Grade = people[0].Grade;
残念ながら、実際のビジネスオブジェクトには4つよりも多くのメンバーがあり、これは書くのが面倒であり、他の誰かが初めて見るのは大変です。
また、リフレクションを利用して、これらの反復的なチェックと割り当てをループに入れることも検討しました。
string[] members = new string[] { "FirstName", "LastName", "Age", "Grade" };
foreach (string member in members)
{
if (people.Select(p => p.**member**).Distinct().Count() == 1)
unionMan.**member** = people[0].**member**;
}
**メンバー**は、ただし、リフレクションにより、その特定のメンバーの取得と保存が可能になります(可能な場合)。
最初の解決策は機能し、2番目の解決策は機能すると思いますが、この問題に対するより良い代替解決策はありますか?そうでない場合、上記のように反射を使用することは可能でしょうか?