Мой первый дополнительный метод, это могло быть записано лучше?

@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");
    }
}
6
задан Nick Allen 22 May 2009 в 13:34
поделиться

6 ответов

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));
}
5
ответ дан 8 December 2019 в 13:02
поделиться

Да! Во-первых, вам нужно проверить 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 и ваши параметры код назовите тех.

7
ответ дан 8 December 2019 в 13:02
поделиться

Другой вариант был бы. Это упростит ваш сайт для звонков, поскольку, если у вас есть пара строк, с которыми вы сопоставляете, вам не придется создавать массив или список в коде.

 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;    

}
3
ответ дан 8 December 2019 в 13:02
поделиться

для упрощения использования 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;
}
1
ответ дан 8 December 2019 в 13:02
поделиться

В том, что вы делаете, нет ничего плохого. Однако этот тип функциональности уже существует в нескольких вариантах.

Пример:

var candidates = List<SomeObject>(); 
if (candidates.Count(c=> string.Compare(c.PropertyValue, queryString["secure"], StringComparison.InvariantCultureIgnoreCase) == 0) > 0)
{
 parameters.Protocol = Protocol.https;
}
0
ответ дан 8 December 2019 в 13:02
поделиться

Сделайте ваш параметр 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 перед выполнением действий (защитная кодирование). Это не более безопасно, но упрощает локализацию ошибки.

2
ответ дан 8 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: