2013-01-21 21 views
15
string[] lines3 = new string[100]; 
List<string> lines2 = new List<string>(); 
lines3 = Regex.Split(s1, @"\s*,\s*"); 

if (!lines2.Contains(lines3.ToString())) 
{ 
    lines2.AddRange(lines3.Distinct().ToArray()); 
} 

मैं सभी रिक्त स्थान आदि की जाँच कर ली, लेकिन मैं अभी भी मेरे Lines2 में डुप्लिकेट मानों मिल Listसे बचें एक सूची सी # करने के लिए डुप्लिकेट तत्वों को जोड़ने

मैं अपने डुप्लिकेट मानों यहीं

+0

Lines2 जबकि कॉपी करने और कोड – vini

+0

चिपकाने खेद स्ट्रिंग की सूची एक छोटा सा त्रुटि कर दिया था = SBC की तरह दो तार के बीच एक स्थान नहीं हो सकता BGP – vini

+2

आप के लिए एक HashSet का उपयोग कर विचार सूची के बजाय है है इस मामले में, यह बहुत बेहतर प्रदर्शन करेगा। – bashmohandes

उत्तर

18

आपका यह दूर करने के लिए है जांचें:

if (!lines2.Contains(lines3.ToString())) 

अमान्य है। आप जांच कर रहे हैं कि lines2 में System.String[] है lines3.ToString() आपको यह देगा। आपको यह जांचना होगा कि lines3 से आइटम lines2 में मौजूद है या नहीं।

आप lines3 में प्रत्येक आइटम को फिर से सक्रिय कर सकते हैं यह जांचें कि यह lines2 में मौजूद है और फिर इसे जोड़ें। कुछ इस तरह।

foreach (string str in lines3) 
{ 
    if (!lines2.Contains(str)) 
     lines2.Add(str); 
} 

या यदि आपके lines2 किसी भी खाली सूची है, तो आप बस lines3 विशिष्ट मानों सूची की तरह जोड़ सकते हैं:

lines2.AddRange(lines3.Distinct()); 

फिर अपने lines2 विशिष्ट मान शामिल होंगे।

3

यदि आप किसी सूची में डुप्लीकेट नहीं चाहते हैं, तो HashSet का उपयोग करें। इस तरह यह आपके कोड को पढ़ने वाले किसी और को स्पष्ट करेगा कि आपका इरादा क्या था और आपके पास HashSet से पहले से लिखने के लिए कम कोड होगा जो आप करने की कोशिश कर रहे हैं।

+1

हैशसेट pls पर विचार करने वालों के लिए जागरूक रहें कि आपको – BKSpurgeon

1

यदि आपकी जांच काम करेगी, तो यह या तो सभी वस्तुओं को जोड़ा होगा, या कोई भी नहीं। हालांकि, किसी सरणी पर ToString विधि को डेटा प्रकार का नाम देता है, सरणी की सामग्री नहीं, और Contains विधि केवल एक ही आइटम की तलाश कर सकती है, वैसे भी वस्तुओं का संग्रह नहीं।

आप सरणी में प्रत्येक स्ट्रिंग की जाँच करने के लिए है:

string[] lines3; 
List<string> lines2 = new List<string>(); 

lines3 = Regex.Split(s1, @"\s*,\s*"); 

foreach (string s in lines3) { 
    if (!lines2.Contains(s)) { 
    lines2.Add(s); 
    } 
} 

हालांकि, अगर आप एक रिक्त सूची से शुरू करते हैं, आप Distinct विधि डुप्लिकेट निकालने के लिए उपयोग कर सकते हैं, और आप केवल की एक पंक्ति की जरूरत है कोड:

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList(); 
23

आप जो Lines2 में नहीं है Enumerable.Except उपयोग कर सकते हैं lines3 से अलग आइटम प्राप्त करने:

lines2.AddRange(lines3.Except(lines2)); 

यदि लाइन 2 में लाइन 3 से सभी आइटम शामिल हैं तो कुछ भी नहीं जोड़ा जाएगा। बीटीडब्ल्यू आंतरिक रूप से दूसरे अनुक्रम से अलग आइटम प्राप्त करने और पहले अनुक्रम में मौजूद वस्तुओं को सत्यापित करने के लिए Set<string> का उपयोग करने के अलावा। तो, यह बहुत तेज़ है।

1

आप इस्तेमाल कर सकते हैं एक सरल Union + Distinct:

var lines = lines2.Union(lines3).Distinct(); 

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

संदर्भ: http://msdn.microsoft.com/en-us/library/bb341731.aspx

1

आप एक संग्रह आप HashSet Class की कोशिश कर सकते में विशिष्ट मानों को बचाने के लिए चाहते हैं। यह स्वचालित रूप से डुप्लिकेट मानों को हटा देगा और आपके कोडिंग समय को बचाएगा। :)

19

उपयोग एक List<string> के बजाय एक HashSet<string>। यह बेहतर प्रदर्शन करने के लिए तैयार है क्योंकि आपको किसी भी आइटम के लिए चेक प्रदान करने की आवश्यकता नहीं है। संग्रह आपके लिए इसका प्रबंधन करेगा। list और set के बीच यह अंतर है। नमूने के लिए:

HashSet<string> set = new HashSet<string>(); 

set.Add("a"); 
set.Add("a"); 
set.Add("b"); 
set.Add("c"); 
set.Add("b"); 
set.Add("c"); 
set.Add("a"); 
set.Add("d"); 
set.Add("e"); 
set.Add("e"); 

var total = set.Count; 

कुल 5 है और मूल्यों a, b, c, d, e हैं।

List<T> का कार्यान्वयन आपको नटिवली नहीं देता है। आप इसे कर सकते हैं, लेकिन आपको यह नियंत्रण प्रदान करना होगा। नमूने के लिए, इस extension method:

public static class CollectionExtensions 
{ 
    public static void AddItem<T>(this List<T> list, T item) 
    { 
     if (!list.Contains(item)) 
     { 
      list.Add(item); 
     } 
    } 
} 

और इसका इस्तेमाल करते हैं:

var list = new List<string>(); 
list.AddItem(1); 
list.AddItem(2); 
list.AddItem(3); 
list.AddItem(2); 
list.AddItem(4); 
list.AddItem(5); 
+0

गारंटीकृत आदेश की गारंटी नहीं दी जा सकती है, ध्यान रखें कि 'हैशसेट' अनियंत्रित है, जिसका अर्थ यह है कि आइटम को जोड़े जाने के क्रम को बनाए रखा नहीं जाता है। यदि उसे एक विशिष्ट आदेश बनाए रखने की आवश्यकता है, तो 'हैशसेट' काम नहीं करेगा। –

0

के साथ एक HashSet का प्रयोग कर अपने List:

List<string> myList = new List<string>(); 
HashSet<string> myHashSet = new HashSet<string>(); 

public void addToList(string s) { 
    if (myHashSet.Add(s)) { 
     myList.Add(s); 
    } 
} 

myHashSet.Add(s)trues अगर वापस आ जाएगी यह में मौजूद नहीं है ।

0

एक अच्छा तरीका नहीं है लेकिन त्वरित फिक्स, यह देखने के लिए एक बूल लें कि पूरी सूची में कोई डुप्लिकेट प्रविष्टि है या नहीं।

bool containsKey; 
string newKey; 

    public void addKey(string newKey){ 

     foreach(string key in MyKeys){ 
      if(key == newKey){ 
      containsKey = true; 
      } 
     } 

     if(!containsKey){ 
     MyKeys.add(newKey); 
    }else{ 
     containsKey = false; 
    } 

    }