2009-05-26 12 views
33

के साथ एक ड्रॉपडाउन सूची पॉप्युलेट करने के लिए नाम से लिंक विशिष्ट() नामक मैं बेयर, मेडली इत्यादि जैसे दवा कंपनियों के साथ ड्रॉप डाउन सूची को पॉप्युलेट करने की कोशिश कर रहा हूं और, मुझे डीबी और थेसिस से थेस नाम मिल रहे हैं डीबी में नाम दोहराए जाते हैं, लेकिन अलग-अलग आईडी के साथ।नाम और मूल्य

मैं लिंक विशिष्ट() का उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं समानता तुलनाकर्ता का उपयोग नहीं करना चाहता हूं। क्या कोई और तरीका है?

मेरी ड्रॉप डाउन सूची आईडी और कंपनी के नाम से भरी जानी चाहिए। DDL में

var x = _partnerService 
      .SelectPartners() 
      .Select(c => new {codPartner = c.codPartner, name = c.name}) 
      .Distinct(); 

यह दोहराया दिखा रहा है कंपनियों:

मैं की तरह कुछ कोशिश कर रहा हूँ।

धन्यवाद!

+0

यदि कोई कंपनी अलग-अलग आईडी के साथ कई बार दिखाई देती है और आप उन्हें केवल एक बार प्रकट करना चाहते हैं, तो कौन सी आईडी दिखानी चाहिए? सबसे पहला? कोई फर्क नहीं पड़ता? –

+0

आईडी पहचान – AndreMiranda

उत्तर

76

निम्नलिखित अभिव्यक्ति केवल अलग कंपनियों का चयन करें और अपने आईडी के साथ पहला मामला वापस आ जाएगी।

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First()); 
+0

हाय डैनियल! यही वही था जो मुझे चाहिए था! धन्यवाद! :-) – AndreMiranda

+0

बस सही! :) – rafek

+0

जब मैं करता हूं: dgvRecords.DataSource = (gb से dbContext.records g से g) .GroupBy (g => g.ID)। चयन करें (g => g.FirstOrDefault()); मुझे मिलता है: संदेश = निर्दिष्ट विधि समर्थित नहीं है। स्रोत = MySql.Data.Entity –

3

पूरे चयन पर विशिष्ट काम करता है। यदि आप चयन में c.codPartner शामिल करते हैं, और उसी c.name के लिए c.codPartner के दो अलग-अलग मान हैं, तो आप एक ही c.name के साथ दो पंक्तियां देखने जा रहे हैं।

0

अन्य अधिभारों में से एक का उपयोग करके अलग-अलग विधि में अपने स्वयं के तुलना में पास करें।

(extension) IQueryable<T> IQueryable<T>.Distinct(IEqualityComparer<T> comparer) 
+0

यह कुछ भी नहीं बदलेगी ... अगर एक ही नाम वाली कई कंपनियां हैं लेकिन अलग-अलग आईडी हैं, तो आप आईडी का उपयोग कैसे करेंगे? –

+0

मैं सहमत हूं - आईडी चुनना एक समस्या होगी। यदि आप प्रत्येक के लिए एक विशिष्ट आईडी चाहते हैं, तो इक्विलिटी कॉम्पैयर के साथ एक विशिष्ट का उपयोग करके शायद जाने का रास्ता नहीं होगा। साथ ही, यहां डाउनवोट पर ध्यान रखें कि मूल प्रश्न ने अलग-अलग परिणामों में प्रत्येक आइटम के लिए एक विशिष्ट आईडी चुनने के बारे में कुछ नहीं कहा ... –

1

आप एक IEqualityComparer पैरामीटर निर्दिष्ट नहीं करते हैं, तो यह सिर्फ Object.ReferenceEquals का उपयोग करेगा, जो वस्तुओं GetHashKey मूल्य पर लग रहा है। अज्ञात प्रकार के लिए, वे अद्वितीय हैं।

अब इसे हल करना थोड़ा मुश्किल है, क्योंकि आप किसी अज्ञात प्रकार के लिए IEqualityComparer नहीं लिख सकते हैं। तो अगर आप समस्या के लिए एक असली प्रकार बनाने muct:

class Partner 
{ 
    public int codPartner {get; set;} 
    public string name {get; set;} 
    public override int GetHashCode() { return name .GetHashCode();} 
} 

var x = _partnerService.SelectPartners() 
     .Select(c => new Partner {codPartner = c.codPartner, name = c.name}) 
     .Distinct(); 
+0

संदर्भ एक्वाकल्स हैशकोड की तुलना नहीं करता है, यह संदर्भों की तुलना करता है ... यह केवल तभी वापस आ जाएगा जब दो संदर्भ एक ही उदाहरण को इंगित करते हैं –

2

मुझे नहीं लगता कि आप एक अनाम वर्ग के साथ ऐसा कर सकते हैं, लेकिन आप

class Foo 
{ 
    private int _ID; 

    public int ID 
    { 
     get { return _ID; } 
     set { _ID = value; } 
    } 
    private string _Name; 

    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; } 
    } 

} 

की तरह एक डेटा वस्तु बनाई यदि आप बना सकते हैं

की तरह एक comparer वस्तु
class FooComparer : IEqualityComparer<Foo> 
{ 


    public bool Equals(Foo x, Foo y) 
    { 
     return x.Name == y.Name; 
    } 

    public int GetHashCode(Foo obj) 
    { 
     return obj.GetHashCode(); 
    } 

} 
17
var distinctCompanies = Companies 
    .GroupBy(c => c.CompanyName) 
    .Select(g => g.First()); 
+0

पूछने के लिए खेद है, लेकिन 'जी' कहां से है? – StarCub

+1

@StarCub कंपनियां एक आईनेमेरेबल है। GroupBy स्वीकार करता है और IENumerable > देता है। चयन में प्रत्येक आइटम एक IGrouping <स्ट्रिंग, कंपनी> है। मैंने अंतर को और अधिक स्पष्ट बनाने के लिए एक अलग नाम का उपयोग किया। –

1

भेद करने के लिए GetHashCode का उपयोग करता है, तो आप इसे (एक IEqualityComparer के माध्यम से) बता नहीं है जाएगा एक और विधि का प्रयोग करें। आप इस प्रकार का सामान्य equalitycomparer इस्तेमाल कर सकते हैं,:

public class GenericEqualityComparer<T> : IEqualityComparer<T> 
{  
    private Func<T, T, Boolean> comparer;  

    public GenericEqualityComparer(Func<T, T, Boolean> comparer)  
    {   
     this.comparer = comparer;  
    }  

    #region IEqualityComparer<T> Implementation 

    public bool Equals(T x, T y)  
    {   
     return comparer(x, y);  
    }  

    public int GetHashCode(T obj)  
    { 
     return obj.GetHashCode(); 
    }  

    #endregion 
} 

और फिर इस (kindof) की तरह का उपयोग

public static IEqualityComparer<YourType> MyComparer 
{ 
    get 
    { 
     return new GenericEqualityComparer<YourType>((x, y) => 
     { 
      return x.name.Equals(y.name); 
     }); 
     } 
} 
संबंधित मुद्दे