Подсчитать количество совпадений в списке

Demiz

Client
Регистрация
19.12.2017
Сообщения
145
Благодарностей
69
Баллы
28
Доброго дня. Есть список, в котором нужно подсчитать количество совпадений в третьей строке у каждого фио. Например Иванов, сколько у него количества "нет" и количества не имеющая "нет", в данном случая это любая дата. В итоге должно получится Иванов:0%:2(это 2 значения с датой):3(это 3 значения Нет), Петров:50%:3:2 и т.д

Сам список:

Иванов
0%
01.10.2021
Иванов
0%
02.10.2021
Иванов
0%
Нет
Иванов
0%
Нет
Иванов
0%
Нет
Петров
50%
Нет
Петров
50%
Нет
Петров
50%
03.10.2021
Петров
50%
04.10.2021
Петров
50%
05.10.2021

Стандартными кубиками работа со списком не получилось или не хватает скила. Заранее спасибо
 

Carty

Client
Регистрация
16.06.2021
Сообщения
39
Благодарностей
66
Баллы
18
Этот linq будет сниться в ночных кошмарах
C#:
var l = new List<string>
{
    "Иванов",
    "0%",
    "01.10.2021",
    "Иванов",
    "0%",
    "02.10.2021",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "03.10.2021",
    "Петров",
    "50%",
    "04.10.2021",
    "Петров",
    "50%",
    "05.10.2021",
};

var l2 = l
    // Формируем список из строк в список { строка, индекс }
    .Select((item, index) => new { item, index })
    // Группируем список по делимости на 3 и возвращаем строку без индекса
    // 0, 1, 2 при целочисленном делении на 3 вернет 0
    // 3, 4, 5 при целочисленном делении на 3 вернет 1 и тд
    .GroupBy(i => i.index / 3, i => i.item)
    // Создаем из группы список анонимных объектов для простоты понимания
    .Select(g => new { Name = g.First(), Percentage = g.ElementAt(1), Wtf = g.Last() })
    // Группируем по имени
    // Группа "Иванов" будет содержать все анонимные объекты с данной фамилией и тп
    .GroupBy(i => i.Name)
    // По группам составляем итоговый результат
    .Select(g => new
    {
        // "Key" имя группы, т.е. фамилия
        Name = g.Key,
        // Для примера взял лишь первый элемент
        Percentage = g.First().Percentage,
        // Подсчет по всем объеткам внутри группы по дате
        DateCount = g.Count(i => DateTime.TryParse(i.Wtf, out _)),
        // Подсчет по всем объеткам внутри группы по "нет"
        NoCount = g.Count(i => i.Wtf.ToLower() == "нет")
    })
    .Select(i => $"{i.Name}:{i.Percentage}:{i.DateCount}:{i.NoCount}");

foreach (var item in l2)
    Console.WriteLine(item);
C#:
var l = new List<string>
{
    "Иванов",
    "0%",
    "01.10.2021",
    "Иванов",
    "0%",
    "02.10.2021",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "03.10.2021",
    "Петров",
    "50%",
    "04.10.2021",
    "Петров",
    "50%",
    "05.10.2021",
};

var l2 = l
    .Select((item, index) => new { item, index })
    .GroupBy(i => i.index / 3, i => i.item)
    .Select(g => new { Name = g.First(), Percentage = g.ElementAt(1), Wtf = g.Last() })
    .GroupBy(i => i.Name)
    .Select(g => new
    {
        Name = g.Key,
        Percentage = g.First().Percentage,
        DateCount = g.Count(i => DateTime.TryParse(i.Wtf, out _)),
        NoCount = g.Count(i => i.Wtf.ToLower() == "нет")
    })
    .Select(i => $"{i.Name}:{i.Percentage}:{i.DateCount}:{i.NoCount}");

foreach (var item in l2)
    Console.WriteLine(item);
 
  • Спасибо
Реакции: Astraport и Demiz

Demiz

Client
Регистрация
19.12.2017
Сообщения
145
Благодарностей
69
Баллы
28
Этот linq будет сниться в ночных кошмарах
C#:
var l = new List<string>
{
    "Иванов",
    "0%",
    "01.10.2021",
    "Иванов",
    "0%",
    "02.10.2021",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "03.10.2021",
    "Петров",
    "50%",
    "04.10.2021",
    "Петров",
    "50%",
    "05.10.2021",
};

var l2 = l
    // Формируем список из строк в список { строка, индекс }
    .Select((item, index) => new { item, index })
    // Группируем список по делимости на 3 и возвращаем строку без индекса
    // 0, 1, 2 при целочисленном делении на 3 вернет 0
    // 3, 4, 5 при целочисленном делении на 3 вернет 1 и тд
    .GroupBy(i => i.index / 3, i => i.item)
    // Создаем из группы список анонимных объектов для простоты понимания
    .Select(g => new { Name = g.First(), Percentage = g.ElementAt(1), Wtf = g.Last() })
    // Группируем по имени
    // Группа "Иванов" будет содержать все анонимные объекты с данной фамилией и тп
    .GroupBy(i => i.Name)
    // По группам составляем итоговый результат
    .Select(g => new
    {
        // "Key" имя группы, т.е. фамилия
        Name = g.Key,
        // Для примера взял лишь первый элемент
        Percentage = g.First().Percentage,
        // Подсчет по всем объеткам внутри группы по дате
        DateCount = g.Count(i => DateTime.TryParse(i.Wtf, out _)),
        // Подсчет по всем объеткам внутри группы по "нет"
        NoCount = g.Count(i => i.Wtf.ToLower() == "нет")
    })
    .Select(i => $"{i.Name}:{i.Percentage}:{i.DateCount}:{i.NoCount}");

foreach (var item in l2)
    Console.WriteLine(item);
C#:
var l = new List<string>
{
    "Иванов",
    "0%",
    "01.10.2021",
    "Иванов",
    "0%",
    "02.10.2021",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Иванов",
    "0%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "Нет",
    "Петров",
    "50%",
    "03.10.2021",
    "Петров",
    "50%",
    "04.10.2021",
    "Петров",
    "50%",
    "05.10.2021",
};

var l2 = l
    .Select((item, index) => new { item, index })
    .GroupBy(i => i.index / 3, i => i.item)
    .Select(g => new { Name = g.First(), Percentage = g.ElementAt(1), Wtf = g.Last() })
    .GroupBy(i => i.Name)
    .Select(g => new
    {
        Name = g.Key,
        Percentage = g.First().Percentage,
        DateCount = g.Count(i => DateTime.TryParse(i.Wtf, out _)),
        NoCount = g.Count(i => i.Wtf.ToLower() == "нет")
    })
    .Select(i => $"{i.Name}:{i.Percentage}:{i.DateCount}:{i.NoCount}");

foreach (var item in l2)
    Console.WriteLine(item);
Спасибо большое все работает!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)