少し前に、あなたの問題を解決できるかもしれないことをいくつか書きました...(実際、あなたが持っているシードを含めることでおそらく改善される可能性があります...)
とにかく、このプロジェクトは Essence ( http://essence.codeplex.com/ ) と呼ばれ、System.Linq.Expression ライブラリを使用して (属性に基づいて) Equals/GetHashCode/CompareTo/ToString の標準表現を生成します。引数リストに基づいて IEqualityComparer および IComparer クラスを作成できるためです。(他にもいくつかのアイデアがありますが、先に進む前にコミュニティからのフィードバックを得たいと考えています。)
(これが意味することは、手書きとほぼ同じくらい速いということです-そうでない主なものはCompareTo()です;Linq.Expressionsには3.5リリースの変数の概念がないため、一致しない場合に、基礎となるオブジェクトで CompareTo() を 2 回呼び出す. Linq.Expressions への DLR 拡張機能を使用すると、これが解決されます. エミット il を使用することもできたと思いますが、そのときはそれほど刺激を受けませんでした. .)
これは非常に単純なアイデアですが、これまでに見たことがありません。
要するに、私はそれを磨くことへの興味を失いました (これには、codeproject の記事を書いたり、コードの一部を文書化したりすることが含まれていたはずです)。興味を持っている。
(codeplex サイトにはダウンロード可能なパッケージがありません。ソースに移動してそれを入手してください。おお、それは f# で書かれています (ただし、すべてのテスト コードは c# で書かれています)。
とにかく、ここにプロジェクトのテストからのc#の例があります:
// --------------------------------------------------------------------
// USING THE ESSENCE LIBRARY:
// --------------------------------------------------------------------
[EssenceClass(UseIn = EssenceFunctions.All)]
public class TestEssence : IEquatable<TestEssence>, IComparable<TestEssence>
{
[Essence(Order=0] public int MyInt { get; set; }
[Essence(Order=1] public string MyString { get; set; }
[Essence(Order=2] public DateTime MyDateTime { get; set; }
public override int GetHashCode() { return Essence<TestEssence>.GetHashCodeStatic(this); }
...
}
// --------------------------------------------------------------------
// EQUIVALENT HAND WRITTEN CODE:
// --------------------------------------------------------------------
public class TestManual
{
public int MyInt;
public string MyString;
public DateTime MyDateTime;
public override int GetHashCode()
{
var x = MyInt.GetHashCode();
x *= Essence<TestEssence>.HashCodeMultiplier;
x ^= (MyString == null) ? 0 : MyString.GetHashCode();
x *= Essence<TestEssence>.HashCodeMultiplier;
x ^= MyDateTime.GetHashCode();
return x;
}
...
}
とにかく、誰かが価値があると思うなら、このプロジェクトには磨きをかける必要がありますが、アイデアはそこにあります...