2012-08-08 15 views
48

से डुप्लिकेट मान हटाएं मान लें कि मेरे पास तालिका से आने वाले कुछ कॉलम मानों की एक सूची है, मैं खाली तार और डुप्लिकेट मान कैसे हटा सकता हूं। कृपया निम्नलिखित कोड देखें:सूची से रिक्त तारों को कैसे निकालें, फिर सूची

List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList(); 

यह वह जगह है बस अब मैं क्या कोडित है, लेकिन लेकिन Amiram के कोड तरह से और अधिक सुरुचिपूर्ण है, इसलिए मैं का चयन करेंगे कि इसका जवाब यहाँ कैसे मैंने किया है:

DataTable dtReportsList = someclass.GetReportsList(); 

     if (dtReportsList.Rows.Count > 0) 
     { 


      List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList(); 
      dtList.RemoveAll(x=>x == ""); 
      dtList = dtList.Distinct().ToList();   

      rcboModule.DataSource = dtList; 
      rcboModule.DataBind();    
      rcboModule.Items.Insert(0, new RadComboBoxItem("All", "All")); 


     } 
+0

समझें कि RemoveAll() mutt dtList को समझता है; हटाए गए प्रत्येक तत्व को अंतर्निहित सरणी में उच्च सूचकांक में तत्वों को पुनर्व्यवस्थित करने के लिए सूची को बल दिया जाता है। उन्हें आसानी से छोड़ना होगा जैसे कि अमीरम अपनी कहां से करता है। – KeithS

उत्तर

119
dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList() 

मुझे लगता है कि खाली स्ट्रिंग और व्हाइटस्पेस शून्य की तरह हैं। नहीं आप IsNullOrEmpty (अनुमति देने के खाली स्थान के), या s != null उपयोग कर सकते हैं

+2

मुझे यह बहुत अच्छा कोड पसंद है – EaterOfCode

+0

बस एक चीज; अलग() के साथ deduping अपेक्षाकृत अक्षम है क्योंकि विधि सबसे खराब मामला मानना ​​चाहिए। – KeithS

+0

@ किथ्स हम इस डेटा के बारे में क्या अनुमान लगाते हैं कि 'विशिष्ट' ऐसा नहीं है जिससे इसे अनुकूलित किया जा सके? – Servy

7

Amiram के जवाब सही है, लेकिन अलग() के रूप में लागू एक एन आपरेशन है; सूची में प्रत्येक आइटम के लिए, एल्गोरिदम इसे पहले से संसाधित तत्वों से तुलना करता है, और यदि यह अद्वितीय है या इसे अनदेखा करता है तो इसे वापस कर देता है। हम बेहतर कर सकते हैं।

क्रमबद्ध सूची रैखिक समय में deduped किया जा सकता है; यदि वर्तमान तत्व पिछले तत्व के बराबर है, तो इसे अनदेखा करें, अन्यथा इसे वापस करें। सॉर्टिंग NlogN है, इसलिए संग्रह को सॉर्ट करने के लिए भी, हमें कुछ लाभ मिलता है:

public static IEnumerable<T> SortAndDedupe<T>(this IEnumerable<T> input) 
{ 
    var toDedupe = input.OrderBy(x=>x); 

    T prev; 
    foreach(var element in toDedupe) 
    { 
     if(element == prev) continue; 

     yield return element; 
     prev = element;  
    } 
} 

//Usage 
dtList = dtList.Where(s => !string.IsNullOrWhitespace(s)).SortAndDedupe().ToList(); 

यह वही तत्व देता है; वे बस क्रमबद्ध हैं।

+0

ग्रेट। यदि मैं गलत नहीं हूं, तो तत्वों को पुन: सक्रिय करके आप वास्तव में ऑर्डर कर रहे हैं। क्या आप अपनी विधि को "आलसी" बनाने का तरीका सोच सकते हैं? –

+0

दुर्भाग्यवश, अधिकांश प्रकारों को पूरे संग्रह के ज्ञान की आवश्यकता होती है; आखिरी तत्व पहले व्यक्ति हो सकता है जिसे वापस करने की आवश्यकता है। इसलिए, इनपुट के सभी तत्वों का मूल्यांकन आउटपुट के पहले तत्व का उत्पादन करने के लिए किया जाना चाहिए। एकमात्र प्रकार जिसे मैं सोच सकता हूं उसके आउटपुट के अगले तत्व को खोजने के बाद बाधित किया जा सकता है, एक चयन सॉर्ट संस्करण है, और उस स्थिति में हम वापस आ गए हैं जहां हमने शुरू किया था। – KeithS

+0

इसके अलावा, हमारे मामले में, पूरे ऑपरेशन का परिणाम एक सूची है, जिसके साथ "उत्सुक" निष्पादन की आवश्यकता होती है। यदि हम इसके साथ एक आईनेमरेबल के रूप में काम करना चाहते हैं और इसके निष्पादन को रोकना चाहते हैं, तो आप फ़ंक्शन का मांस ले सकते हैं और इसे एक छिपी हुई इटरेटर कक्षा में डाल सकते हैं जो IENumerable लागू करता है। – KeithS

1

अमीरराम कोरच समाधान वास्तव में साफ है। बहुमुखी प्रतिभा के लिए यहां एक विकल्प है।

var count = dtList.Count; 
// Perform a reverse tracking. 
for (var i = count - 1; i > -1; i--) 
{ 
    if (dtList[i]==string.Empty) dtList.RemoveAt(i); 
} 
// Keep only the unique list items. 
dtList = dtList.Distinct().ToList(); 
+3

हालांकि यह काम करेगा, जहां खंड तेजी से है क्योंकि इसे इनपुट संग्रह को म्यूटेट करने की आवश्यकता नहीं है। आप "शिफ्ट" की संख्या को कम कर रहे हैं जो सूची से तत्वों को हटाते समय किया जाना चाहिए, लेकिन इनपुट से कुछ भी नहीं हटाता है; यह सिर्फ उन तत्वों पर छोड़ देता है जो मेल नहीं खाते हैं। स्पष्टीकरण के लिए – KeithS

+0

धन्यवाद। – IneedHelp

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