2011-04-09 14 views
6

मुझे आश्चर्य है कि मैं इसे कैसे प्राप्त कर सकता हूं?linq में अलग?

मैं वस्तुओं

MyObject a = new Object(); 
a.Name = 'One'; 
a.Value = '10'; 


MyObject b = new Object(); 
b.Name = 'One'; 
b.Value = '15'; 


MyObject c = new Object(); 
c.Name = 'Two'; 
c.Value = '10'; 

तो मैं केवल वापस नाम प्राप्त करना चाहते हैं के संकलन में से केवल अलग नामों प्राप्त करना चाहते हैं। मुझे इस मामले में सिर्फ नाम का मूल्य नहीं है।

तो मैं

की कोशिश की // एक संग्रह करने के लिए सभी वस्तुओं को जोड़ने।

myCollection.Disinct()..Select(x => new MyClassToStore() {Text = x.Name, Value = x.Name}).ToList()); 

हालांकि मुझे ऑब्जेक्ट स्तर पर संपत्ति स्तर पर अलग-अलग करने की आवश्यकता है। तो मैं वापस "एक" और "दो" चाहता हूँ। अभी मुझे "वन", "वन" और "टू" वापस मिल गया है।

मुझे morelinq नामक एक लाइब्रेरी दिखाई देती है, लेकिन मुझे यकीन नहीं है कि मुझे इसका उपयोग बीटा में अभी भी करना चाहिए और अब यह विकसित नहीं होता है।

प्लस एक निकास क्वेरी के लिए एक संपूर्ण लाइब्रेरी के साथ मुझे यकीन नहीं है कि यह इसके लायक है या नहीं।

+0

संबंधित: http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property – Cameron

उत्तर

14

यह भरता दोनों पाठ और मूल्य क्षेत्रों:

myCollection.Select(x => x.Name).Distinct() 
     .Select(x => new MyClassToStore { Text = x, Value = x }).ToList(); 
22

शायद ऐसा कुछ मदद कर सकता है?

var distinctItems = items 
    .GroupBy(x => x.PropertyToCompare) 
    .Select(x => x.First()); 
+0

मैं इसे कैसे MyClassToStore में छड़ी मिल सकता है – chobo2

+0

वर distinctitems = myCollection.GroupBy (x => x.Name)। चयन करें (x => x.First())। चुनें (नया MyClassToStore() {text = x.Name, value = x.Name}) मुझे लगता है, बिल्कुल मुझे बिल्कुल नहीं मिला जिसकी आपको जरूरत है। क्योंकि एक ही संपत्ति (नाम) का दो बार उपयोग करना थोड़ा अजीब है ... मुझे लगता है कि आपको कैमरून को सुनना चाहिए यदि आपको केवल नामों की आवश्यकता है ... –

6

तुम सिर्फ वापस अलग नामों चाहते हैं, आप उपयोग कर सकते हैं:

myCollection.Select(x => x.Name).Distinct().ToList(); 
2

व्यक्तिगत तौर पर मैं आप ऑपरेटर को ओवरराइड का सुझाव == और! = और निर्धारित करें कि एक वस्तु कैसे और क्यों अद्वितीय है। फिर संग्रह पर अलग() कॉल का उपयोग करें।

आपको शून्य मानों से सावधान रहना होगा, माइक्रोसॉफ्ट के Guidelines for Overloading Equals() and Operator == (C# Programming Guide) देखें।

+1

स्पष्ट होने के लिए, '==' या '! =' को ओवरराइड न करें किसी भी प्रकार के वैश्विक संदर्भ में ऑपरेटर। यहां बताया गया है कि 'इक्विल्स' और '==' ऑपरेटर को आपकी ऑब्जेक्ट 'ऑब्जेक्ट' से प्राप्त करने के लिए ओवरराइड करना है –

2

आप अपनी कक्षा को कार्यान्वित कर सकते हैं ताकि linq विशिष्ट ऑपरेटर डिफ़ॉल्ट समानता तुलनाकर्ता का उपयोग न करे।

class YourClass:IEquatable<YourClass> 
{ 

... आपके कार्यान्वयन विवरण। ...

public bool Equals(YourClass other) 
    { 
     if (Object.Equals(this, other)) 
     { 
      return true; 
     } 
     else 
     { 
      if(Name == other.Name && Value == other.Value) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

public override int GetHashCode() 
{ 
    return Name.GetHashCode()^Value.GetHashCode(); 
} 

} 
संबंधित मुद्दे