2011-05-16 15 views
5

मुख्य सवाल यह है कि जाँच करने के लिए:यदि एक सरणी में तार एक और सरणी से स्ट्रिंग से युक्त

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Guns", "Roses", "Violets"} 

क्या "सबसे कम कोड है:
ठीक है दोस्तों, यहाँ स्थिति है, के 2 स्ट्रिंग सरणियों पर विचार करते हैं लाइनों में स्ट्रिंग युक्त foo में तारों को पुनर्प्राप्त करने के लिए "लाइन" तरीका है?
(यानी, इस मामले में, foo के 2 पहले तत्व)

बेशक मैं "हाथ से" सभी तर्क कर के रूप में मुझे यकीन है कि Linq एक दूसरे को काटना सुविधा के साथ और अधिक कुशल है कर रहा हूँ से बचना चाहते हैं, लेकिन मैं इस सटीक कार्य को करने के लिए इसका उपयोग कैसे करें, यह नहीं पता।

TieBreakers:
1 - क्या होगा अगर foo तार कि बार की अधिक है कि एक तत्व होता है,

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Roses", "Violets", "are"} 

और मैं डुप्लिकेट से बचने के लिए करना चाहते हैं?

2 - क्या होगा यदि मेरे पास 2 "बार" सरणी हैं जिन्हें मैं एक foo सरणी के विरुद्ध जांचना चाहता हूं?
क्या बार 1 और बार 2 मर्ज करना या बार 1 के साथ फ़िल्टर करने के लिए और फिर बार 2 के साथ फ़िल्टर करना अधिक कुशल है?


Thanx और मजेदार जवाब दे :-) है

उत्तर

6

LINQ अच्छी तरह से काम करता है, हाँ:

var mixed = foo.Where(x => bar.Any(y => x.Contains(y)); 

ध्यान दें कि आप अभी भी केवल एक बार foo के प्रत्येक तत्व देखेंगे, अगर सब पर।

आप एक से अधिक bar सरणियों है, तो आप उपयोग कर सकते हैं:

var mixed = foo.Where(x => bar1.Concat(bar2) 
           .Any(y => x.Contains(y)); 
1
string[] foo = new string[] { "Roses are #FF0000", "Violets are #0000FF", "Paint it #000000" }; 
string[] bar = new string[] { "Guns", "Roses", "Violets" }; 

var matches = from f in foo 
       where bar.Any(b => f.Contains(b)) 
       select f; 

foreach (var m in matches) 
    Console.WriteLine(m); 
+0

हाँ यह भी काम करता है (कि वाक्य रचना मैं पहले कुछ साल का उपयोग कर रहा था), हालांकि यह जल्दी है चुनिंदा और बयानों के बिना करने के लिए। Thanx। –

+0

@ मिका, मैं क्वेरी सिंटैक्स पसंद करता हूं, खासकर जब प्रश्न आकार में इससे बड़े होते हैं। मुझे यह और अधिक पठनीय लगता है। –

2

अपने विवरण में string मान लिया जाये कि अपने शिक्षक के गलती है तो

var result=foo.Where(w=>bar.Any(iw=>w.Contains(iw))); 

मुझे यकीन है कि क्या डुप्लिकेट नहीं कर रहा हूँ आपका मतलब है, यह केवल foo में तत्वों को दिखाएगा, इससे कोई फर्क नहीं पड़ता कि bar में कितनी बार दिखाई देते हैं।

2 टाई ब्रेकर के रूप में, तुम सब करने की है कुछ इस तरह है:

var result=foo.Where(w=>bar1.Any(iw=>w.Contains(iw))||bar2.Any(iw=>w.Contains(iw))); 
+0

ThanX यह ठीक काम करता है लेकिन मुझे इसे बदलने के लिए 'iw => iw.Contains (w)' to iw => w.Contains (wi) 'को उलटा करना था। इसके अलावा, मैंने || बदल दिया करने के लिए && (मैंने आपका अंतिम वाक्यविन्यास प्रस्ताव चुना है क्योंकि यह मुझे समझ में आया है, एक कोड पढ़ने परिप्रेक्ष्य बनाते हैं। –

+0

|| उनमें से किसी एक में अर्थ है, और उनमें से दोनों में मतलब है, मुझे लगता है कि आप पूर्व का मतलब है। – Blindy

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