सूची में अलग-अलग मूल्यों की सूची प्राप्त करें


175

C # में, मेरा कहना है कि तीन स्ट्रिंग सदस्य चर के साथ नोट नामक एक वर्ग है।

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

और मेरे पास टाइप नोट की एक सूची है:

List<Note> Notes = new List<Note>();

लेखक कॉलम में सभी अलग-अलग मूल्यों की सूची प्राप्त करने का सबसे साफ तरीका क्या होगा?

मैं सूची के माध्यम से पुनरावृत्ति कर सकता हूं और उन सभी मूल्यों को जोड़ सकता हूं जो स्ट्रिंग की दूसरी सूची में डुप्लिकेट नहीं हैं, लेकिन यह गंदा और अक्षम लगता है। मुझे लगता है कि वहाँ कुछ जादुई Linq निर्माण है कि यह एक पंक्ति में करूँगा, लेकिन मैं कुछ भी करने में सक्षम नहीं है।

जवाबों:


331
Notes.Select(x => x.Author).Distinct();

यह मानों IEnumerable<string>का एक क्रम ( ) लौटाएगा Author- एक अद्वितीय मूल्य।


1
नोट्स। चयन (x => x.Author) .As समानांतर ()। अंतर (); यदि हम ऑर्डर की परवाह नहीं करते हैं और सूची में अधिक आइटम हैं, तो "AsParallel ()" कुछ प्रदर्शन लाभ दे सकता है।
साईं

1
@ कीननेट, Defaultसमानता की तुलना करने वाले पर विचार करने वाला अलग । msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx
Georg Patscheider

क्या हमें ToList () से पहले जोड़ने की जरूरत है। distinct ()?
फन Pc B Jannh

1
डिस्टिंक्ट से पहले नहीं () लेकिन बाद में, यदि आप किसी सूची में बदलने की कोशिश कर रहे हैं। Ex: Notes.Select (x => x.Author) .Distinct ()। ToList ();
MTwiford

87

लेखक द्वारा नोट वर्ग को विकृत करें

var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}

1
यह माना नहीं है Notesके रूप में Notes.GroupBy()एक बहुवचन के साथ sके रूप में Noteकेवल एक एकल नोट का आयोजन करेगा?
१६

30

जॉन स्कीट ने एक लाइब्रेरी लिखी है जिसका नाम मोरेलिनक है जिसमें एक DistinctBy()ऑपरेटर है। कार्यान्वयन के लिए यहां देखें । आपका कोड लगेगा

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

अपडेट: अपने प्रश्न को फिर से पढ़ने के बाद, किर्क का सही उत्तर है यदि आप सिर्फ लेखकों के एक अलग सेट की तलाश कर रहे हैं।

जोड़ा गया नमूना, DistinctBy में कई क्षेत्र:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

बहुत बड़िया धन्यवाद। मुझे लगता है कि डिस्टिक्ट मेथड को कॉल करने से पहले अगर मैं सूची का आदेश देता हूं तो यह सही क्रम रखता है।
विल्हेम

मैंने लिंक अपडेट किए। MoreLINQ Github पर है और इसे Nuget के माध्यम से स्थापित किया जा सकता है:Install-Package morelinq
चाड लेवी

2
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

उपरोक्त तर्क का उपयोग करके, हम अद्वितीय Courses प्राप्त कर सकते हैं ।


ToList से पहले अपना डिस्टिक्ट मेरे समय को बचाए रखता है .. मैं ToList के बाद कर रहा हूं और वह त्रुटि देता है जो सूची को Ienumerable में परिवर्तित नहीं कर सकता है।
Ajay2707

डिस्टिक्ट यहाँ काम नहीं करेगा क्योंकि इस ऑपरेटर के लिए हर ऑब्जेक्ट ऑब्जेक्ट के हैशकोड के आधार पर अद्वितीय है। - आप इस के लिए कुछ इसी तरह की जरूरत है github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs
Bose_geek

-2
mcilist = (from mci in mcilist select mci).Distinct().ToList();

वास्तव में mci क्या है? सिर्फ एक उदाहरण तालिका? जवाब थोड़ा अजीब है जैसा है।
ब्रैड कोच

1
हाँ, मुझे नहीं लगता कि यह वही है जो मेरे मूल प्रश्न की तलाश में था (डेढ़ साल पहले यह कोई बात नहीं थी और परियोजना पूरी होने तक लंबी है)। मैं जो बता सकता हूं, यह तब काम करेगा जब मेरे पास पहले से ही लेखक स्ट्रिंग की एक सूची होगी जिसमें डुप्लिकेट हो सकते हैं, लेकिन ऐसी सूची को उन वस्तुओं की सूची से निकालने के लिए उपयोग नहीं किया जा सकता है जिनके पास लेखक स्ट्रिंग उनके क्षेत्रों में से एक है।
डारेल हॉफमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.