簡単に言うと、オブジェクトのコレクションが2つあります。1つには適切な値(「Good」と呼びましょう)が含まれ、もう1つにはデフォルト値(Mr.「Default」)が含まれます。グッドとデフォルト、そしてデフォルトの間の連合の交差点が欲しい。言い換えると、Intersect(Union(Good、Default)、Default)です。デフォルトとして解決されると思うかもしれませんが、ここで注意が必要です。カスタムIEqualityComparerを使用します。
私は次のクラスを取得しました:
class MyClass
{
public string MyString1;
public string MyString2;
public string MyString3;
}
class MyEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass item1, MyClass item2)
{
if(item1 == null && item2 == null)
return true;
else if((item1 != null && item2 == null) ||
(item1 == null && item2 != null))
return false;
return item1.MyString1.Equals(item2.MyString1) &&
item1.MyString2.Equals(item2.MyString2);
}
public int GetHashCode(MyClass item)
{
return new { item.MyString1, item.MyString2 }.GetHashCode();
}
}
これが私のコレクションの特徴ですGoodコレクションとDefaultコレクション:
デフォルト:これは、必要なすべての{MyString1、MyString2}ペアを含む大きなセットですが、ご想像のとおり、MyString3値はデフォルト値です。
良い:これは小さなセットで、ほとんどがデフォルトセットにあるアイテムを含みますが、いくつかの良いMyString3値が含まれています。また、必要なセットの外にある{MyString1、MyString2}もあります。
私がしたいのはこれです:デフォルトにあるGoodからのアイテムだけを取りますが、それにデフォルトにある他のアイテムを追加します。
これが、私が思うに、私の最善の試みです:
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
私はそれがうまくいくはずだと教えましたが、私が得る結果は基本的に良い{MyString1、MyString2}ペアセットだけですが、すべてデフォルトセットから来ているので、全体にデフォルト値があります。また、最後の交差のデフォルトとグッドを切り替えてみましたが、同じ結果が得られます。