Сведения о вопросе

Solllo

09:55, 26th August, 2020

Теги

c#   linq    

Лучший способ получить количество IEnumerable

Просмотров: 493   Ответов: 10

Какой самый лучший / простой способ получить количество элементов в коллекции IEnumerable без перечисления всех элементов в коллекции?

Возможно с LINQ или Lambda?



  Сведения об ответе

FAriza

11:42, 16th August, 2020

Решение зависит от того, почему вы не хотите перечислять через коллекцию.

Если это связано с тем, что перечисление коллекции может быть медленным, то нет решения, которое будет быстрее. Вы можете рассмотреть возможность использования ICollection вместо этого, если это возможно. Однако, если перечисление не является чрезвычайно медленным (например, оно считывает элементы с диска), скорость не должна быть проблемой.

Если это связано с тем, что перечисление коллекции потребует большего количества кода, то он уже был написан для вас в форме.Count() метод расширения. Просто используйте MyEnumerable.Count().

Если это потому, что вы хотите иметь возможность перечислить коллекцию после того, как вы посчитали, то .Count() метод расширения позволяет это сделать. Вы даже можете позвонить .Count() о коллекции, которую вы находитесь в середине перечисления, и она будет продолжаться с того места, где она была до подсчета. Например:

foreach (int item in Series.Generate(5))
{
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}

даст свои результаты

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

Если это связано с тем, что перечисление имеет побочные эффекты (например, запись в disk/console) или зависит от переменных, которые могут изменяться между подсчетом и перечислением (например, чтение с диска) [N.B. Если это возможно, я бы предложил переосмыслить архитектуру, поскольку это может вызвать много проблем] тогда одна из возможностей рассмотреть чтение перечисления в прерывистое хранилище. Например:

List<int> seriesAsList = Series.Generate(5).ToList();

Все вышеперечисленное предполагает, что вы не можете изменить тип (т. е. он возвращается из библиотеки, которой вы не владеете). Если это возможно, вы можете рассмотреть возможность изменения для использования ICollection или IList (ICollection имеет более широкую область действия, чем IList), который имеет свойство Count на нем.


  Сведения об ответе

screen

15:58, 16th August, 2020

В любом случае, вы должны пройти через него. Linq предлагает метод Count :

var result = myenum.Count();


  Сведения об ответе

VCe znayu

10:12, 3rd August, 2020

Вам придется перечислять, чтобы получить счет. Другие конструкции, такие как список, сохраняют текущий счетчик.


  Сведения об ответе

PAGE

01:00, 16th August, 2020

Использовать это.

IEnumerable list =..........;

list.OfType<T>().Count()

он вернется граф.


  Сведения об ответе

appple

01:08, 21st August, 2020

Есть также IList или ICollection, если вы хотите использовать конструкцию, которая все еще несколько гибка, но также имеет необходимую вам функцию. Они оба подразумевают IEnumerable.


  Сведения об ответе

repe

08:41, 4th August, 2020

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

myEnumerable.Any() над myEnumerable.Count(), где первое даст первый элемент, а второе даст все элементы.


  Сведения об ответе

lats

01:49, 16th August, 2020

IEnumerable придется перебирать каждый элемент. чтобы получить полный счет. Если вам просто нужно проверить, есть ли один или несколько элементов в IEnumerable, более эффективный метод-проверить, есть ли они. Any() только проверьте, чтобы увидеть, что есть значение и не петля через все.

IEnumerable myStrings = новый List(){"one","two", "three"};

боол hasValues = myStrings.Any();


  Сведения об ответе

JUST___

10:26, 11th August, 2020

Самое лучшее решение -как мне кажется, это сделать следующее:

  1. использование System.Linq.Dynamic;
  2. myEnumerable.AsQueryable().Count()


  Сведения об ответе

dumai

11:27, 18th August, 2020

Если вам нужно посчитать, а затем зациклиться, вам может быть лучше со списком.

Если вы используете count для проверки членов, вы можете использовать Any() , чтобы избежать перечисления всей коллекции.


  Сведения об ответе

qwerty101

22:34, 13th August, 2020

Не возможно с LINQ, как вызов .Рассчитывать(...) действительно перечисляет коллекцию. Если вы столкнулись с проблемой, в которой вы не можете повторить сбор дважды, попробуйте сделать это:

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться