@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doneButtonClick:)
name:MPMoviePlayerDidExitFullscreenNotification
object:nil];
- (void)doneButtonClick:(NSNotification*)aNotification
{
if (self.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
{
NSLog(@"done button tapped");
}
else
{
NSLog(@"minimize tapped");
}
}
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 вам не нужно сначала помещать свои строки в массив.
var match = "loool".EqualsAny(StringComparison.Ordinal, "hurf", "Durf");
Linq-ified (JC + me) с NRE (стандарт фреймворка):
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));
}
Да! Во-первых, вам нужно проверить s на нуль. Кроме того, пусть он принимает любой IEnumerable
для токенов, а не просто массив, а затем использует другие операторы linq для проверки:
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));
}
Размышление о том, как обрабатывать null
значение s, есть третий вариант, который еще никто не использовал:
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));
}
Наконец, относительно выбранной вами реализации: если вы собираетесь иметь перегрузки, у вас также могут быть перегрузки IEnumerable и ваши параметры
код назовите тех.
Другой вариант был бы. Это упростит ваш сайт для звонков, поскольку, если у вас есть пара строк, с которыми вы сопоставляете, вам не придется создавать массив или список в коде.
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;
}
для упрощения использования EqualsAny вы можете использовать varargs и стратегию по умолчанию для
StringComparison
:
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;
}
В том, что вы делаете, нет ничего плохого. Однако этот тип функциональности уже существует в нескольких вариантах.
Пример:
var candidates = List<SomeObject>();
if (candidates.Count(c=> string.Compare(c.PropertyValue, queryString["secure"], StringComparison.InvariantCultureIgnoreCase) == 0) > 0)
{
parameters.Protocol = Protocol.https;
}
Сделайте ваш параметр tokens
более общим, то есть сделайте его IEnumerable
.
Также уже существует эквивалентный метод, расширяющий IEnumerable <>
, например Any
:
public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType)
{
return tokens.Any(t => s.Equals(t, comparisonType));
}
Кроме того, Джоэл, конечно, прав: вы можете проверить значения null
перед выполнением действий (защитная кодирование). Это не более безопасно, но упрощает локализацию ошибки.