Как я могу получить количество элементов списка, которые соответствуют определенным критериям? - PullRequest
0 голосов
/ 17 марта 2012

Мне нужно, например, количество элементов списка, которые НЕ "". Банкомат, я решаю это так:

    public int getRealCount()
    {
        List<string> all = new List<string>(originList);
        int maxall = all.Count;
        try
        {
            for (int i = 0; i < maxall; i++)
            {
                all.Remove("");
            }
        }
        catch { }
        return all.Count;
    }

Без сомнения, производительность довольно плохая. Мне повезло, что это просто список из 10 пунктов, но на телефоне вы должны избегать такого кода.

Итак, мой вопрос, как я могу улучшить этот код?

Одна идея заключалась в том, что уже может быть метод для этого. Вторым методом будет то, что все могут быть заполнены только элементами, которые не являются "".

Как мне решить эту проблему?

Спасибо

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

Звучит так, как вы хотите:

return originList.Count(x => x != "");

Нет необходимости создавать копию коллекции вообще.Обратите внимание, что вам потребуется using System.Linq; в ваших директивах using в начале вашего исходного кода.

(Обратите внимание, что у вас не должны быть такие пустые блоки catch - это ужасная идея подавления исключений таким способом. Поймать исключения можно только тогда, когда вы хотите действительно обработать их или когда вы хотите сбросить их, завернутые в другой тип.* игнорируйте исключение, вы должны хотя бы где-нибудь зарегистрировать его.)

2 голосов
/ 17 марта 2012

Если вам важна производительность, вы должны хранить коллекцию, предназначенную только для этих предметов.

Если производительность не имеет большого значения, я бы посоветовал вам использовать запрос Linq для вашей коллекции.Крутая вещь в Linq заключается в том, что поиск задерживается до тех пор, пока он вам не понадобится.

int nonEmptyItemCount = originList.Count(str => !string.IsNullOrEmpty(str));

Вы также можете сделать

int nonEmptyItemCount = originList.Count(str => str != "");
1 голос
/ 17 марта 2012

Вы должны использовать LINQ. Установите ReSharper, он сгенерирует его для вас.

Кроме того, не создавайте int maxall = all.Count и затем используйте его в цикле for.

Для мобильных приложений не следует использовать ненужную память, поэтому просто используйте all.Count в цикле for.

1 голос
/ 17 марта 2012

Вы вызываете all.remove ("") для каждого элемента в списке all. Почему бы просто не позвонить один раз? Вы вообще не используете i в своем коде ...

Почему бы и нет:

   public int getRealCount()
   {
        List<string> all = new List<string>(originList);

       int erased =all.RemoveAll(delegate(string s)
        {
            return s == "";
        });

        return all.Count - erased;
   }

Обновление:

Исправлена ​​проблема, которая у меня была. Это без лямбды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...