C# - непонятно, как работает подсчет количества элементов коллекции с помощью Linq

326
29 сентября 2017, 15:31
List<object> li = new List<object>() {0,1,"текст 1",0,2,3,3.4,4,3,1,9,3.4,"1"};
foreach (var x in li.GroupBy(c => new { Name = c }).
  Select( c => new { c.Key.Name, Count = c.Count() }))
{
  Console.WriteLine($"{x.Name} содержится: {x.Count}  {x.Name.GetType()}");
}

Здесь с помощью лямда выражений происходит поиск количества элементов в списке. Но я не понимаю как это работает.

Answer 1

Итак у вас есть коллекция объектов.

GroupBy в foreach формирует структуру IEnumerable<IGrouping<TKey, TElement>> в TKey в данном случае записывается экземпляр анонимного типа с единственным полем Name а во внутреннюю коллекцию частичного результата группировки IGrouping<TKey, TElement>.elements все копии объекта переданного в Name с типом TElement. В данном тип TElement это object.

Структура IEnumerable<IGrouping<TKey, TElement>> чем-то напоминает IEnumerable<KeyValuePair<TKey, List<TElement>>>, где TKey общий признак для группировки, а List все элементы удовлетворяющие признаку.

Затем вы делаете Select по этой структуре в которой пробегаете по всем KeyValuePair<TKey, List<TElement>> и создаете коллекцию экземпляров других анонимных типов которые содержат поля Name и Count в которые вы записываете сответственно (TKey).Name экземпляра первого анонимного типа и количество объектов в коллекции (List<TElement>).Count.

Затем эта коллекция анонимных экземпляров попадает в foreach в которой вы поочередно выводите .Name и .Count.

READ ALSO
Сброс куки Forms authentication

Сброс куки Forms authentication

Есть приложение, в котором нужно кое-что подчистить перед тем, как куки Forms Authentication истекутЯ пробовал переопределять методы AuthorizeAttribute, но поле...

190
Маски в dataGridView

Маски в dataGridView

Подскажите, как сделать так, чтобы при редактировании ячейки в dataGridView, при вводе некорректных данных (например формат ячейки DATE, а вводятся...

191
Как передать переменную в функцию из другого js файла

Как передать переменную в функцию из другого js файла

Допустим у меня есть два файла: 1js и 2

421
Как автоматически менять прокси phantomjs?

Как автоматически менять прокси phantomjs?

Возникла проблема c прокси при работе с phantomjs

231