2009-05-22 16 views
6

, sadeceİlk uzantı yöntemim daha iyi yazılabilir mi? Bu bana oldukça yararlı görünmektedir bir uzatma yönteminin benim ilk denemem olduğu için

if (queryString["secure"].EqualsAny(new string[] {"true","1"}, StringComparison.InvariantCultureIgnoreCase)) 
{ 
    parameters.Protocol = Protocol.https; 
} 

tarafından ben aradım doğru rotayı

public static bool EqualsAny(this string s, string[] tokens, StringComparison comparisonType) 
    { 
     foreach (string token in tokens) 
     { 
      if (s.Equals(token, comparisonType)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

gidiyorum emin olmak DÜZENLEME: Bazı mükemmel öneriler, tam olarak aradığım şey gibi. Teşekkür

DÜZENLEME:

aşağıdaki uygulanması

public static bool EqualsAny(this string s, StringComparison comparisonType, params string[] tokens) 
{ 
    // for the scenario it is more suitable for the code to continue 
    if (s == null) return false; 

    return tokens.Any(x => s.Equals(x, comparisonType)); 
} 

public static bool EqualsAny(this string s, params string[] tokens) 
{ 
    return EqualsAny(s, StringComparison.OrdinalIgnoreCase, tokens); 
} 

o

if (queryString["secure"].EqualsAny("true","1")) 
{ 
    parameters.Protocol = Protocol.https; 
} 

bir çok ağlamaya çağıran kod basitleştirilmiş çünkü IEnumerable üzerinde params kullanarak tercih karar verdik önceki

if (queryString["secure"] != null) 
{ 
    if (queryString["secure"] == "true" || queryString["secure"] == "1") 
    { 
     parameters.Protocal = Protocal.https; 
    } 
} 

Tekrar teşekkürler!

+0

Şahsen, Uzantınızın yönteminin sözdizimi hakkında merak önce bir ön soru sormak gerektiğini düşünüyorum. İlk olarak, diğerlerinin de belirttiği gibi, bu sadece tokens.Any() yönteminin bir tersine çevrilmesidir, ikincisi, kullanım örneğinizde, okunması ve değiştirilmesi kolay olan basit bir kavramdır "bu doğru bir değerdir" Özel bir uzantı yöntemini ve bir on-the-fly dizisini içeren karmaşık bir ifadeyle. IMO, bu küçük gereksiz gereksizlik parçaları eklenir. – tnyfst

cevap

5
public static bool EqualsAny(
    this string s, 
    StringComparison comparisonType, 
    params string[] tokens) 
{ 
    foreach (string token in tokens) 
    { 
     if (s.Equals(token, comparisonType)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Params ile dizelerinizi önce bir diziye zorlamak zorunda değilsiniz.

var match = "loool".EqualsAny(StringComparison.Ordinal, "hurf", "Durf"); 

(JC beni +) bir NRE (çerçeve standardı) ile Linq ified:

public static bool EqualsAny(
    this string s, 
    StringComparison comparisonType, 
    params string[] tokens) 
{ 
    if(s == null) throw new NullReferenceException("s"); 
    return tokens.Any(x=> s.Equals(x, comparisonType)); 
} 
2

tokens parametresini daha genel bir şekilde hazırlayın - yani bir IEnumerable<string> ürününe girin. Ayrıca, IEnumerable<>, örn., IEnumerable<> sayılı belgeye uzanan eşdeğer bir yöntem zaten var. Any:

Ayrıca
public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType) 
{ 
    return tokens.Any(t => s.Equals(t, comparisonType)); 
} 

Joel ders hakkının şudur: eylemleri (defansif kodlama) gerçekleştirmeden önce null değerleri kontrol etmek isteyebilirsiniz. Bu daha güvenli değil, ancak hatayı yerelleştirmeyi kolaylaştırır. Eğer StringComparison için varargs ve varsayılan stratejiyi kullanabilir EqualsAny kullanımını kolaylaştırmak amacıyla

+0

@Joel: Haklısınız. Daha genel olarak * herhangi bir tür hata işleme hakkında konuşuyordum. 'NullReferenceException' atılması daha uygun olabilir. Dediğiniz gibi: burada hangi davranışların tercih edildiğini bilmiyoruz. –

+0

Eh, 'ArgumentNullException' demek istedim. –

+0

Evet derim, kesinlikle daha az güvenlidir ve muhtemelen yerelleştirilmesi daha da zordur çünkü kod, hata yüzeylerinden görünür bir şekilde uzun bir süre önce geçersiz bir yanlış varsayımla çalışabilir. Bir istisna atmak daha uygun olabilir, ancak OP'nin örneklemi yazarken hangi davranışı gerektirdiğini bilemeyiz. Böylece daha iyi ya da daha kötüsü için önyargı, sadece çalışan kod sağlamaktır. –

1

:

public static bool EqualsAny(this string s, params string[] tokens) { 
    return EqualsAny(s, StringComparison.InvariantCultureIgnoreCase, tokens); 
} 

public static bool EqualsAny(this string s, 
          StringComparison stringComparison, 
          params string[] tokens) { 
    // your method 
} 

if (queryString["secure"].EqualsAny("true", "1")) { 
    parameters.Protocol = Protocol.https; 
} 
+0

params son argüman olmalı. – Will

7

Evet tarafından çağrılır! Öncelikle, s için boş kontrol etmelisiniz. Ayrıca, yerine sadece bir dizi daha simgeleri için herhangi IEnumerable<string> kabul edin ve daha sonra kontrol yapmak için başka linq operatörlerini kullanalım:

public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType) 
{ 
    if (s== null) return false; 
    return tokens.Any(t => s.Equals(t, comparisonType)); 
} 

s için bir null değerini nasıl işleneceği konusunda düşünerek üçte var seçenek henüz kimse kullanılır:

public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType) 
{ 
    if (s== null) return tokens.Any(t => t == null); 
    return tokens.Any(t => s.Equals(t, comparisonType)); 
} 

Son olarak, seçtiğiniz uygulama ile ilgili: Eğer aşırı yükleri zorunda gidiyoruz, sen de IEnumerable overloa sahip olabilir Ayrıca ds ve params kodunuzu bunlara sahip.

+0

Bunun null olarak kontrol edilmesi gerektiğini kabul ediyorum, ama emin değilim –

+0

Evet, o zaman canlı görüntüde yayın göründükten sonra bir önizleme penceresi güncellendikten sonra –

+0

güncellendi (string == null)? – Will

3

Diğer bir seçenek olacaktır. Bu, arama sitenizi basitleştirecektir çünkü bir çift diziniz varsa, karşınızdaki eşleşmeniz, diziyi veya kod içinde liste oluşturmak zorunda kalmayacaktır.

public static bool EqualsAny(this string s,StringComparison comparisonType, param string[] tokens) 
{ 
    return EqualsAny(s,comparisonType,tokens); 
}  

public static bool EqualsAny(this string s,StringComparison comparisonType, IEnumerable<string>tokens)  
{ 
    //Throw nullReference to keep the semantics aligned with calling an instance member 
    if (s==null) throw new NullReferenceException();  
    foreach (string token in tokens)   
    {    
     if (s.Equals(token, comparisonType))    
     {     
      return true;    
     }   
    }   
    return false;  

} 
0

Yaptığınız şeyle ilgili yanlış bir şey yok. Bununla birlikte, bu tür işlevler birkaç farklı modata zaten var olur.

Örnek: Hatta bu yöntemi istiyorsun:

var candidates = List<SomeObject>(); 
if (candidates.Count(c=> string.Compare(c.PropertyValue, queryString["secure"], StringComparison.InvariantCultureIgnoreCase) == 0) > 0) 
{ 
parameters.Protocol = Protocol.https; 
} 
+0

Yeh, ama bunu çok yapıyorsanız yardımcı uzatma yöntemi çok daha okunabilir kodlar sağlar - ve kendi içinde çok fazla değer vardır. – joshcomley

İlgili konular