2012-06-12 9 views
21

सी # .net का उपयोग कर दो सरणी स्ट्रिंग की तुलना कैसे करें? उदाहरण के लिए:सी # में दो स्ट्रिंग एरे के बीच अंतर कैसे प्राप्त करूं?

string[] com1 = { "COM6", "COM7" }; 
string[] com2 = { "COM6", "COM7","COM8" }; 

यहाँ COM1 और COM2 सरणी स्ट्रिंग कर रहे हैं। परिणाम: COM8। इसे कैसे प्राप्त करें?

+9

यह वास्तव में मदद मिलेगी सबसे छोटा रास्ता लगता है: अगर 'COM8' एक सीरियल पोर्ट पहचानकर्ता को संदर्भित करता है, तो आप एक केस-संवेदी तुलना प्रदर्शन करना चाहते हैं यदि आप तुलना करने के बारे में अधिक विशिष्टता देंगे जो आप बनाना चाहते हैं। उदाहरण के लिए, क्या आप आदेश को महत्वपूर्ण मानते हैं? मामला? इसके बारे में क्या है यदि कोई तत्व 'com1' में होता है लेकिन 'com2' नहीं होता है? –

उत्तर

6

मैं इस को हल करने के लिए इस

foreach (string com in com2) 
{ 
    if (!com1.Contains(com)) 
    { 
     MessageBox.Show(com); 
    } 
} 
17

Linq Except extension का उपयोग करना:

IEnumerable<string> result = com2.Except(com1); 
// result: { "COM8" } 
+0

सुझाव: 'परिणाम' को 'छोड़कर' (या दूसरी तरफ) – Default

49

ऐसा लगता है कि आप चाहते हैं सब कुछ में array2 को छोड़कर क्या array1 में बताया गया है:,

var onlyInArray2 = array2.Except(array1); 
बेशक

अगर आप भी को पता है कि केवल array1 में था आप इस्तेमाल कर सकते हैं चाहता था:

var onlyInArray1 = array1.Except(array2); 

(यह सभी को .NET 3.5 या उच्चतर, या LINQBridge जैसे ऑब्जेक्ट्स कार्यान्वयन के लिए वैकल्पिक LINQ की आवश्यकता है।)

मुझे लगता है कि मतभेदों की गणना करते समय ऑर्डर महत्वपूर्ण नहीं है - Except एक सेट-आधारित ऑपरेटर है, इसलिए मान लें कि आप सेट के रूप में संग्रह के संबंध में हैं।

Except सिर्फ रिटर्न

कृपया ध्यान दें कि IEnumerable<T> - अगर आप सरणियों के रूप में परिणाम चाहते हैं, आप ToArray कॉल करने के लिए की आवश्यकता होगी:

var onlyInArray2 = array2.Except(array1).ToArray(); 
var onlyInArray1 = array1.Except(array2).ToArray(); 

आप सममित अंतर चाहते हैं, यानी आप केवल परवाह के बारे में जो मूल्य हैं एक सारिणी, बल्कि जो सरणी की तुलना में वे से आया है, आप इस्तेमाल कर सकते हैं:

var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2)); 

या आप HashSet सीधे इस्तेमाल कर सकते हैं:

var set = new HashSet<string>(array1); 
// This modifies the set... 
set.SymmetricExceptWith(array2); 

इन सभी में, परिणामस्वरूप आदेश अनिर्धारित है, हालांकि अभ्यास में Except पहले तर्क के मूल क्रम को संरक्षित रखेगा। हालांकि यह सख्ती से एक कार्यान्वयन विस्तार बोल रहा है, मुझे लगता है कि यह बदलने की संभावना बहुत कम है।

LINQ में दूसरे सेट के आधार पर ऑपरेटरों की तरह, Except केवल एक बार किसी भी तत्व को वापस आ जाएगी - इसलिए यदि COM8array2 में दो बार दिखाई दिया, तो वह केवल परिणाम में एक बार दिखाई देता है।

+1

पर बदलें, महामहिम जॉन, कुछ और जोड़ता है ;-) – aleroot

+2

मुझे लगता है कि यहां आपके बेहतर उत्तरों के साथ आप एक और पुस्तक लिख सकते हैं ... मैं खरीदूंगा यह निश्चित रूप से! – aleroot

2

तुम सब कुछ दोनों एक सूची में है, लेकिन नहीं, एक भी अभिव्यक्ति में है कि चाहते हैं, आप इस्तेमाल कर सकते हैं Union, IntersectऔरExcept:

var inOnlyOneArray = array1.Union(array2).Except(array1.Intersect(array2)); 
+0

+, वह स्मार्ट है! –

1

के रूप में दूसरों को पहले से ही कहा है, Except विस्तार विधि है निश्चित रूप से यहाँ जाने का रास्ता।हालांकि, मैं जोड़ूंगा कि ऐसा लगता है कि आप तुलना कैसे कर सकते हैं इस पर कुछ नियंत्रण चाहते हैं;

var result = com2.Except(com1, StringComparer.OrdinalIgnoreCase); 
संबंधित मुद्दे