2010-08-10 2 views
3

У меня есть метод прямо сейчас, который перебирает список бизнес-объектов (свойство Свойства), чтобы проверить, является ли свойство SerialNumber серийным номером или нет. Если я нахожу серийный номер, я выхожу из цикла и возвращаю true, иначе я возвращаю false.LINQ подход к этому коду

код выглядит следующим образом:

public bool HasSerialNumber() 
    { 
     if (this.Properties != null && this.Properties.Count > 0) 
     { 
      foreach (var property in Properties) 
      { 
       if (!string.IsNullOrEmpty(property.SerialNumber)) 
        return true; 
      } 
     } 
     return false; 
    } 

Есть ли лучший LINQ подход к этому?

Я имею в виду следующее:

return Properties.Where(x => !string.IsNullOrEmpty(x.SerialNumber)).ToList().Count > 0; 

Есть ли лучше/быстрее способ проверки непустой строки?

+0

Даже с вашим примером, вы можете использовать '.Count()' вместо '.ToList(). Count', чтобы немного ускорить работу.' Any() '- путь, который нужно сделать. –

+0

@callum Это дало мне ошибку компилятора когда у меня был только .Count(), поэтому мне пришлось вызвать ToList(). Если я не назвал это неправильным ... – mint

+0

@snow: Странно, он должен работать. По крайней мере это делает: 'var strs = new [] {" "," lol ", null}; Console.WriteLine (strs.Where (s => string.IsNullOrEmpty (s)). Count()); ' –

ответ

12

Вы можете использовать Any вместо проверки того, больше ли счетчика.

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)) 

и, конечно, ваш Properties.Count > 0 проверка является излишним.

+4

+1. Помимо улучшения связи вашего намерения, добавленный бонус использования 'Any()' заключается в том, что базовый список будет повторяться только до тех пор, пока не будет найдено свойство с серийным номером. Если вы используете Count() или ToList(), полный список должен быть оценен, поэтому вы потеряете некоторую производительность. Конечно, в этом случае это не будет иметь большого значения, но все же. – jeroenh

3

Это должно сделать трюк:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)); 
9

Заканчивать IEnumerable<T>.Any():

public bool HasSerialNumber() 
{ 
    if(this.Properties != null) 
     return Properties.Any(p => !string.IsNullOrEmpty(p.SerialNumer)); 
    return false; 
} 
6

Я не думаю, что вы улучшите особенно на производительность string.IsNullOrEmpty(), но один ловушкой вы должны быть избегая последних двух вызовов по вашему запросу - конкретно ToList() и Count().

Что вы делаете, происходит итерация через каждый элемент, преобразование его в список (создание списка и добавление элементов в процесс, а затем повторение каждого элемента в списке, чтобы подсчитать, сколько их есть - все, чтобы проверить ., если одно значение пусто

вы можете использовать метод Any, чтобы найти, если один элемент соответствует определенным критериям, например, так:

return Properties.Any(x => !string.IsNullOrEmpty(x.SerialNumber)); 
Смежные вопросы