Ponieważ jest to moja pierwsza próba metodę rozszerzenia, które wydaje się dość użyteczne dla mnie, po prostu chcę się upewnić, jadę w dół właściwą drogęMoja pierwsza metoda rozszerzenia, czy można ją napisać lepiej?
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;
}
nazywany przez
if (queryString["secure"].EqualsAny(new string[] {"true","1"}, StringComparison.InvariantCultureIgnoreCase))
{
parameters.Protocol = Protocol.https;
}
EDYTOWANIE: Kilka doskonałych sugestii, dokładnie tego rodzaju rzeczy, których szukałem. Dzięki
EDIT:
zdecydowałem na poniższym realizacji
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);
}
wolałem użyciu params nad IEnumerable ponieważ uproszczony kod wywołujący
if (queryString["secure"].EqualsAny("true","1"))
{
parameters.Protocol = Protocol.https;
}
daleko na poprzedni
if (queryString["secure"] != null)
{
if (queryString["secure"] == "true" || queryString["secure"] == "1")
{
parameters.Protocal = Protocal.https;
}
}
Jeszcze raz dziękuję!
Osobiście uważam, że należy zadać pytanie wstępne przed zastanawiać składni metodę rozszerzenia: czy nawet chcą tej metody. Po pierwsze, jak wspominali inni, jest to po prostu odwrócenie tokenów. Any(), a po drugie, w swoim przykładzie użycia, podjąłeś prostą koncepcję "jest to prawdziwa wartość", która powinna być łatwa do odczytania i zastąpienia to ze złożonym wyrażeniem obejmującym niestandardową metodę rozszerzenia i tablicę "w locie". IMO, te małe kawałki zbędnej złożoności sumują się. – tnyfst