के साथ कस्टम प्रकार से समूह के लिए मैं इस वर्गकैसे LINQ
public class Item
{
public Coordinate coordinate { get; set; }
...
...
}
समन्वय के साथ इस तरह परिभाषित किया जा रहा है:
public class Coordinate
{
public Coordinate(float latitude, float longitude)
{
Latitude = latitude;
Longitude = longitude;
}
public float Latitude { get; private set; }
public float Longitude { get; private set; }
}
और मैं उस तरह एक LINQ क्वेरी करना चाहते हैं:
var grouped = from it in items
group it by it.Coordinate into grp
select grp;
As mentioned here by MSDN मैंने सोचा कि यह संभव था अगर मैं अपने समन्वय वर्ग पर बराबर ओवरराइड कर दूं:
नामांकित प्रकार का उपयोग करें यदि आपको क्वेरी चर को दूसरी विधि में पास करना होगा। कुंजी के लिए स्वत: कार्यान्वित गुणों का उपयोग करके एक विशेष कक्षा बनाएं, और उसके बाद बराबर और GetHashCode विधियों को ओवरराइड करें। आप भी एक स्ट्रक्चर का उपयोग कर सकते हैं, जिस स्थिति में आप को विधियों को सख्ती से ओवरराइड करना नहीं चाहते हैं। अधिक जानकारी के लिए देखते हैं कैसे रहे हैं: लागू एक अपरिवर्तनीय कक्षा स्वत: लागू गुण
कार्यान्वयन के बराबर वर्ग समन्वय के लिए है कि:
public override bool Equals(object obj)
{
var coord = obj as Coordinate;
if(coord == null) return false;
return (Latitude == coord.Latitude && Longitude == coord.Longitude);
}
फिर भी मैं नहीं कर सकते इसी तरह निर्देशांक द्वारा समूह के लिए अपने LINQ क्वेरी मिल , के रूप में मेरे परीक्षण में विफल दिखाता है:
[TestMethod]
public void GroupBy_3ItemsWith2DifferentCoordinates_Returns2Groups()
{
var items = new List<Item>
{
new Item {Coordinate = new Coordinate(10, 10)},
new Item {Coordinate = new Coordinate(10, 10)},
new Item {Coordinate = new Coordinate(12, 10)},
};
var grouped = from it in items
group it by it.Coordinate into g
select g;
Assert.AreEqual(2, grouped.Count());
}
वहाँ के लिए एक अधिभार है GrouBy विधि जो IqualityComparer को पैरामीटर के रूप में लेती है, लेकिन क्या समूह खंड का उपयोग करने के बराबर है? क्या मैं कुछ गलत कर रहा हूं ?? कोई विचार?
बस इसे करने की कोशिश की, वो क्या है मैं याद आ रही थी।बढ़िया धन्यवाद :) सार्वजनिक ओवरराइड int GetHashCode() { वापसी ((int) अक्षांश * 100)^((int) रेखांश * 100); } –
यदि आपका हैश कोड क्या कर रहा है, तो आपको यह सुनिश्चित करना चाहिए कि आपका समानता कोड इससे मेल खाता है - वे एक दूसरे के साथ संगत होना चाहिए। –
अक्षांश। गेटहाशकोड()^रेखांश। गेटहाशकोड() अक्षांश और देशांतर को परिवर्तित करते समय समान परिणाम देता है। तो यह एक अच्छा समाधान नहीं था क्योंकि मैं यह सुनिश्चित करना चाहता हूं कि समन्वय (एक्स, वाई)! = समन्वय (वाई, एक्स); आपका कोड संचालन मामलों के आदेश के बाद से काम करता है। परिशुद्धता के लिए धन्यवाद, इससे मदद मिली :) –