2010-05-09 17 views
15

Ben şu operatörlerin herhangi birinden string.Endswith("") kontrol etmek gerekir:Dize nasıl kullanılır Çoklu uçları test etmek için?

ben || operatöre 19 kez kullanmak istemiyorsanız 20 operatörleri varsa +,-,*,/. Böyle basit bir örnek || kullanarak yeterli muhtemelen iyi olmasına rağmen

+0

Neden kullanmak istemem || Şebeke? Bunun için ne olduğunu. EndsWith kullanmayan çözümleri düşünebilir ancak yine de || operatör – Stewart

+4

Saçınık Kısıtlamalar = Ödev –

+3

@stewart: Kontrol edilecek 20 dizim varsa, kullanmam gerekir || operatör 19 kez. – neven

cevap

27

o zaman oldukça kolaydır: aynı sonucu olmasını istiyorsanız

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

, biz sadece iki kez tüm deyimin olumsuzlamak gerekir LINQ:

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

LINQ her zaman iş için doğru çekiç :) – cjk

+1

Sadece böyle bir şey başlatırken bir dizi kullanmak için daha net buluyorum: var operatörleri = new [] {"+", "-", "*", "/" }; '. Veya sadece: bool sonucu = new [] {"+", "-", "*", "/"}.Any(x => test.EndsWith (x));' – Svish

+0

@Svish: Diziye değiştirildi. :) –

0

bir regex ifadesi bir seçenek

8

mi, ayrıca bunun için Regex kullanabilirsiniz:

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

Kişisel olarak hiç RegEx'i tavsiye etmekten çekiniyorum. Sunulan sorun için bu, en karmaşık çözüm olmanın yanı sıra, mümkün olan en yavaş çözüm hakkında. – Stewart

+0

@Stewart: Herhangi bir görev için normal ifadeyi önermek için tereddütsüz olmazdım, ancak burada en basit yöntem olmadığını kabul etmek zorundayım. Regex ile bir hatayı tanıtmak kolaydır, örneğin bu durumda OP daha fazla karakter eklerse, listenin sonuna girmek için dikkatli olmaları gerekir. Başlangıçta eklenirlerse, sözdizimi, sözdizimini yeniden ifade etmek için kullanılmıyorsa, bulunması zor bir yer olabilir. –

+3

Biliyorsunuz, çoğu insan bir dize problemi ortaya çıktığında regex'lere atlıyor, ama bu bir regex'in aslında * temiz, özlü, anlaşılması kolay ve bakımı kolay olduğunu düşündüğüm bir durumdur. regexleri biliyorsun. – mpen

2

Eğer gerçekten istiyorsan, sen Kodunuzda x || y'u değiştirmek için De Morgan'ın yasalarını kullanabilir. Bir versiyon diyor ki: .NET 3.5 kullanıyorsanız

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

Tamamen düzeltmek ve çalışmak, ancak 6 ay içinde bir hata bulmak için bunu okumak istemem. – Stewart

+0

Bu sorunun hiçbir alakası yoktur. –

2

Testi String.IndexOfAny(Char[], Int32) yöntemi kullanarak dize son karakter (str varsayarak değişkendir):

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

Komple ifadesi:

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

Güzel, ancak tüm operatörün yalnızca bir karakterden oluştuğunu varsayar. –

+0

Evet, sorun değil. Dizginin uzunluğunu test etmek için gerekli olan> = 1'dir. –

0

, bağlam eksikliği tamamlamak Verilen olur kolay || operatör kullanımının olmak kullanarak daha kötüdür bu çözüm: Kullanımı

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 = "+-*/"; 

Bir işlev:

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 
TrimEnd kullanma

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

: Entities kullanarak

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

nereden: -

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

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

Ben korkunç eski bu bağlamda LINQ önlemek için okul, ama biridir biliyorum gün bu kodu okumanız gerekecek. LINQ'nun kullanımlarının (belki de bir gün onları bulabileceğinden) eminim ama eminim ki yukarıdaki dört kod satırının yerini alması pek mümkün değil. String.IndexOf(String) kullanma

+1

Yessir. Düzenli ifadeler veya bu cevabı söyleyebilirim. – mpen

+0

Düzenli ifadeleri sevmiyorsunuz, LINQ'den hoşlanmıyorsunuz ... onlarla ilgili herhangi bir sorun nedeniyle değil, ancak okuyamayacağınız için. Bu tamamen senin problemin. –

0

:

str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false 
İlgili konular