2010-11-16 12 views
8

यह जांचने का सबसे तेज़ तरीका क्या होगा कि किसी स्ट्रिंग में C# में स्ट्रिंग सरणी में कोई मिलान है या नहीं? मैं इसे लूप का उपयोग कर कर सकता हूं, लेकिन मुझे लगता है कि यह बहुत धीमा होगा।सी # जांचें कि क्या स्ट्रिंग में स्ट्रिंग सरणी में कोई मिलान है

+3

तुम्हें क्या लगता है यह बहुत धीमी गति से किया जाएगा करते हैं? क्या आपने इसका परीक्षण किया है? आपके डेटा सेट का सामान्य आकार क्या है? ऐसा अनुमान लगाना समय की बर्बादी है। –

+0

क्या आप इनपुट और वांछित परिणाम को स्पष्ट कर सकते हैं? –

+0

इसमें लगभग 60 आइटम हैं, लेकिन उसी घटना में मेरे पास अधिक कोड है। प्रदर्शन ठीक है, लेकिन मैं बस सोच रहा था कि क्या मैं इसे अनुकूलित कर सकता था। – david

उत्तर

4

आप स्ट्रिंग्स या कथन के साथ स्ट्रिंग को जोड़ सकते हैं, और फिर "इसे एक पास में करें", लेकिन तकनीकी रूप से रेगेक्स अभी भी आंतरिक रूप से लूप कर रहा है। अंत में, लूपिंग आवश्यक है।

+0

ठीक है, मैंने इसे एक लूप के साथ किया है। – david

+0

@ डेविड, यहां तक ​​कि regex को लूप की जरूरत है, मुझे लगता है कि ज्यादातर मामलों में यह मैन्युअल रूप से ऐसा करने से अभी भी तेज़ है। इसके अलावा, यह क्लीनर कोड में मदद करता है और इस प्रकार बनाए रखने में आसान है, कहें, आपको मैचों मानदंडों को बदलने की जरूरत है। – xandy

+4

कुछ लोग, जब किसी समस्या का सामना करते हैं, तो सोचें "मुझे पता है, मैं नियमित अभिव्यक्तियों का उपयोग करूंगा।"अब उन्हें दो समस्याएं हैं। –

19

का प्रयोग LINQ:

return array.Any(s => s.Equals(myString)) 

दी, तो आप खाते में संस्कृति और मामले को लेने के लिए चाहते हो सकता है, लेकिन यह सामान्य विचार है। इसके अलावा, यदि समानता आपके "मैचों" से नहीं है, तो आप हमेशा "मैच" के लिए उपयोग करने के लिए आवश्यक फ़ंक्शन कर सकते हैं।

+0

उल्लेख नहीं है: आप अभी भी लूपिंग कर रहे हैं - बस दृश्यों के पीछे। – Dinah

1

यदि "सरणी" कभी भी कभी नहीं बदलेगी (या केवल बार-बार बदल जाएगी), और आपके पास कई इनपुट स्ट्रिंग होंगे जिनके बारे में आप परीक्षण कर रहे हैं, तो आप सरणी से HashSet<string> बना सकते हैं। HashSet<T>.Contains एक ओ (1) ऑपरेशन है, क्योंकि एक लूप के विपरीत ओ (एन) है।

लेकिन हैशसेट बनाने के लिए इसमें कुछ (छोटा) समय लगेगा। यदि सरणी अक्सर बदल जाएगी, तो एक लूप इसे करने का एकमात्र यथार्थवादी तरीका है।

7

अगर यह पूरी तरह से सबसे तेज़ तरीका है, लेकिन तरीके मैं आमतौर पर यह किया है में से एक है मैं वास्तव में आपको नहीं बता सकता:

यह जाँच करेगा स्ट्रिंग सरणी से तार के किसी भी शामिल है:

string[] myStrings = { "a", "b", "c" }; 
string checkThis = "abc"; 

if (myStrings.Any(checkThis.Contains)) 
{ 
    MessageBox.Show("checkThis contains a string from string array myStrings."); 
} 

यदि स्ट्रिंग सभी स्ट्रिंग्स सरणी के (तत्व) होते हैं, बस myStrings.All के लिए अगर बयान में myStrings.Any बदलने की जाँच करें।

मैं आवेदन की किस तरह यह है पता नहीं है, लेकिन मैं अक्सर उपयोग करने की आवश्यकता:

if (myStrings.Any(checkThis.ToLowerInvariant().Contains)) 

तो अगर आप उपयोगकर्ता इनपुट को देखने के लिए जाँच कर रहे हैं, इससे कोई फर्क नहीं होगा, उपयोगकर्ता में प्रवेश करती है कि क्या कैपिटल अक्षरों में स्ट्रिंग, इसे आसानी से ToLowerInvariant() का उपयोग करके उलट किया जा सकता है।

आशा है कि इससे मदद मिलेगी!

+0

यह अच्छा है लेकिन क्या होगा यदि आप विपरीत दिशा में चेक करना चाहते थे ... यानी जांच करें कि उस सबस्ट्रिंग सरणी –

4

वह मेरे लिए ठीक काम करता है:

string[] characters = new string[] { ".", ",", "'" }; 
bool contains = characters.Any(c => word.Contains(c)); 
+0

के आइटम्स में मौजूद है या नहीं, यह एकमात्र ऐसा है जो 'कहां' कथन के अंदर काम करता है एएसपी.नेट कोर में। – VSG24

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