2010-05-09 7 views
15

मैं निम्नलिखित ऑपरेटरों में से किसी से string.Endswith("") में जांच करने की आवश्यकता: +,-,*,/एकाधिक अंतराल के परीक्षण के लिए string.Endswith का उपयोग कैसे करें?

अगर मैं 20 ऑपरेटरों मैं || ऑपरेटर का उपयोग करने के लिए 19 बार नहीं करना चाहती है।

+0

क्यों नहीं आप उपयोग करना चाहते || ऑपरेटर? यह वही है जो इसके लिए है। यदि उन समाधानों के बारे में सोच सकते हैं जो एंड्सविथ का उपयोग नहीं करते हैं, लेकिन वे अभी भी || का उपयोग करते हैं ऑपरेटर – Stewart

+4

हास्यास्पद प्रतिबंध = होमवर्क –

+3

@ स्टुअर्ट: अगर मेरे पास जांच करने के लिए 20 तार हैं, तो मुझे इसका उपयोग करना होगा || ऑपरेटर 1 9 बार। – neven

उत्तर

27

आप .NET 3.5 का उपयोग कर रहे हैं तो इसके साथ काफी आसान है:

!(x || y) == !x && !y 

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

string test = "foo+"; 
string[] operators = { "+", "-", "*", "/" }; 
bool result = operators.Any(x => test.EndsWith(x)); 
+0

LINQ हमेशा नौकरी के लिए सही हथौड़ा है :) – cjk

+1

मुझे इस तरह की चीजों को प्रारंभ करते समय केवल एक सरणी का उपयोग करने के लिए स्पष्ट लगता है: var operators = new [] {"+", "-", "*", "/" }; '। या बस: बूल परिणाम = नया [] {"+", "-", "*", "/"}.Any(x => test.EndsWith (x));' – Svish

+0

@ स्विस: सरणी में बदल गया। :) –

0

एक regex अभिव्यक्ति एक विकल्प नहीं

8

है हालांकि इस तरह एक साधारण उदाहरण शायद काफी अच्छा || उपयोग कर रहा है, तो आपको उसके लिए regex का उपयोग कर सकते हैं:

if (Regex.IsMatch(mystring, @"[-+*/]$")) { 
    ... 
} 
+4

मैं व्यक्तिगत रूप से RegEx की सिफारिश करने में संकोच करता हूं। प्रस्तुत की गई समस्या के लिए यह सबसे धीमी संभव समाधान के साथ-साथ सबसे जटिल होने के बारे में है। – Stewart

+0

@ स्टीवर्ट: मैं किसी भी कार्य के लिए रेगेक्स की सिफारिश करने में संकोच नहीं करता, लेकिन मुझे यह मानना ​​है कि यह यहां सबसे आसान तरीका नहीं है। रेगेक्स के साथ एक त्रुटि शुरू करना आसान है, उदाहरण के लिए यदि ओपी अधिक अक्षरों को सम्मिलित करता है तो उन्हें सूची के अंत में उन्हें दर्ज करने के लिए सावधान रहना चाहिए। यदि वे शुरुआत में जोड़े गए हैं तो हाइफ़न एक श्रेणी बन जाएगा जो त्रुटि खोजने में मुश्किल हो सकती है यदि आप सिंटैक्स को रीगेक्स करने के लिए उपयोग नहीं करते हैं। –

+3

आप जानते हैं, ज्यादातर लोग एक स्ट्रिंग समस्या उत्पन्न होने पर हर बार regexes पर कूदते हैं, लेकिन यह एक ऐसी स्थिति है जहां मुझे लगता है कि वास्तव में एक regex * साफ, संक्षिप्त, समझने में आसान है, और बनाए रखने में आसान ....... अगर आप regexes पता है। – mpen

2

तुम सच में करना चाहते हैं, तो आप अपने कोड में x || y को प्रतिस्थापित करने के लिए डी मॉर्गन के कानूनों का उपयोग कर सकते हैं। एक संस्करण का कहना है:

x || y == !!(x || y) == !(!x && !y) 
+2

पूरी तरह से सही और काम कर रहा है, लेकिन मैं पढ़ना नहीं चाहूंगा कि 6 महीने में एक बग की तलाश में। – Stewart

+0

इस प्रश्न के लिए कोई प्रासंगिकता नहीं है। –

2

टेस्ट स्ट्रिंग String.IndexOfAny(Char[], Int32) विधि का उपयोग कर के अंतिम चार (यह मानते हुए str अपने चर रहा है):

str.IndexOfAny(new char[] {'+', '-', '*', '/'}, str.Length - 1) 

पूरा अभिव्यक्ति:

str.Lenght > 0 ? str.IndexOfAny(new char[] {'+', '-', '*', '/'}, str.Length - 1) != -1 : false 
+0

अच्छा, लेकिन यह मानता है कि सभी ऑपरेटर में केवल एक वर्ण होता है। –

+0

हाँ, यह एक समस्या है। स्ट्रिंग की लंबाई का परीक्षण करने की आवश्यकता है> = 1. –

0

, संदर्भ का पूर्ण अभाव को देखते हुए होगा इस समाधान एक आसान || ऑपरेटर काम का हो का उपयोग कर से भी बदतर है कि:

Boolean check = false; 
if (myString.EndsWith("+")) 
    check = true; 

if (!check && myString.EndsWith("-")) 
    check = true; 

if (!check && myString.EndsWith("/")) 
    check = true; 

etc. 
4
string s = "Hello World +"; 
string endChars = "+-*/"; 

का उपयोग करना एक समारोह:

private bool EndsWithAny(string s, params char[] chars) 
{ 
    foreach (char c in chars) 
    { 
     if (s.EndsWith(c.ToString())) 
      return true; 
    } 
    return false; 
} 

bool endsWithAny = EndsWithAny(s, endChars.ToCharArray()); //use an array 
bool endsWithAny = EndsWithAny(s, '*', '/', '+', '-');  //or this syntax 
,210

LINQ का उपयोग करना:

bool endsWithAny = endChars.Contains(s.Last()); 

TrimEnd का उपयोग करना:

bool endsWithAny = s.TrimEnd(endChars.ToCharArray()).Length < s.Length; 
// als possible s.TrimEnd(endChars.ToCharArray()) != s; 
2

के बारे में कैसे: -

string input = .....; 
string[] matches = { ...... whatever ...... }; 

foreach (string match in matches) 
{ 
    if (input.EndsWith(match)) 
     return true; 
} 

मैं जानता हूँ कि यह dreadfully इस संदर्भ में LINQ से बचने के लिए पुराने स्कूल है, लेकिन एक है दिन आपको इस कोड को पढ़ने की आवश्यकता होगी। मुझे पूरा यकीन है कि LINQ के उपयोग हैं (शायद मैं उन्हें एक दिन पाउंगा) लेकिन मुझे पूरा यकीन है कि यह ऊपर कोड की चार पंक्तियों को प्रतिस्थापित करने के लिए नहीं है।

+1

येसिर। मैं regexes, या यह जवाब कहूंगा। – mpen

+0

आपको रेगेक्स पसंद नहीं है, आपको LINQ पसंद नहीं है ... उनके साथ किसी भी समस्या के कारण नहीं, लेकिन क्योंकि आप उन्हें पढ़ नहीं सकते हैं। यह पूरी तरह से आपकी समस्या है। –

0

का उपयोग String.IndexOf(String):

str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false 
संबंधित मुद्दे