मैं कुछ सामान एक छोटे से वापस है कि आप अपनी समस्या को हल कर सकते हैं ... (और वास्तव में, यह शायद बीज है कि आप शामिल करने के लिए सुधार किया जा सकता ...)
वैसे भी, परियोजना है, जबकि लिखा था सार (http://essence.codeplex.com/) कहा जाता है, और यह सिस्टम /Linq.Expression पुस्तकालयों का उपयोग करता है (गुणों के आधार पर) बराबर/GetHashCode/तुलना करने के लिए/ToString के मानक प्रस्तुतियों के साथ-साथ तर्क सूची के आधार पर IEqualityComparer और IComparer कक्षाएं बनाने में सक्षम होने के नाते । (मेरे पास कुछ और विचार भी हैं, लेकिन बहुत आगे बढ़ने से पहले कुछ सामुदायिक फीडबैक प्राप्त करना चाहते हैं।)
(इसका मतलब यह है कि यह हस्तलिखित होने के लगभग तेज़ है - मुख्य जहां यह नहीं है तुलनात्मक(); Linq.Expressions के कारण 3.5 रिलीज में एक चर की अवधारणा नहीं है - इसलिए आपको मिलान प्राप्त करने पर दो बार अंतर्निहित ऑब्जेक्ट पर तुलनात्मक() को कॉल करना होगा। DLR एक्सटेंशन का उपयोग करना Linq.Expressions के लिए यह हल करता है। मुझे लगता है कि मैं emit il का उपयोग कर सकता था, लेकिन मैं उस समय प्रेरित नहीं था।)
यह काफी आसान विचार है, लेकिन मैंने इसे पहले नहीं देखा है।
अब बात यह है कि, मैं इसे पॉलिश करने में खो गया दिलचस्पी लेता हूं (जिसमें कोडप्रोजेक्ट के लिए एक लेख लिखना शामिल था, कुछ कोड दस्तावेज करना, या जैसा), लेकिन अगर आपको लगता है तो मुझे ऐसा करने के लिए राजी किया जा सकता है यह ब्याज की बात होगी।
(कोडप्लेक्स साइट में डाउनलोड करने योग्य पैकेज नहीं है; बस स्रोत पर जाएं और इसे पकड़ें - ओह, यह f # में लिखा गया है (हालांकि सभी टेस्ट कोड सी # में हैं) क्योंकि वही चीज़ थी जिसमें मुझे रूचि थी । सीखने)
वैसे भी, यहाँ है परियोजना में परीक्षण से ग # उदाहरण हैं:
// --------------------------------------------------------------------
// 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;
}
...
}
वैसे भी, परियोजना, अगर कोई सोचता है कि सार्थक है, चमकाने जरूरत है, लेकिन विचारों देखते हैं ...
कोड ठीक दिखता है। एक सुधार के रूप में आप जांच सकते हैं कि फ़ील्ड [i] शून्य नहीं है या नहीं। –
बस एक जोड़ा: ऑब्जेक्ट प्रकार में एक्सटेंशन विधियों को जोड़ने के लिए यह बेहद अनुशंसित है। –
मुझे पता है, लेकिन क्यों? हमने वास्तव में किसी भी तरह से ऑब्जेक्ट की कार्यक्षमता को नहीं बदला है। आपकी इंटेलि-भावना केवल अव्यवस्थित हो जाएगी। और इसे एक विस्तार विधि बनाने की भी आवश्यकता नहीं है, यह सिर्फ इसे अधिक दृढ़ बनाता है। आप अभी भी ऑब्जेक्ट में गुजरने वाली स्थिर विधि को कॉल कर सकते हैं। –