Как можно сгладить данные в списке, а затем получить счетчик того, что в каждом столбце, с помощью LINQ? - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь создать отчет LINQ, но у меня возникли трудности.

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

Вот что я попробовал:

var AppVersion = CreateExcelFile.ListToDataTable(Start
            .Where(x => x.DeviceName != "Richard iPhone 11")
            .Where(x => x.IsPhysical == true)
            .Select(x => new AppVersionModel
            {
                DateYYMMDD = x.DateYYMMDD,
                Android043 = x.IsAndroid == true && x.AppVersion == "0.4.3" ? 1 : 0,
                Android044 = x.IsAndroid == true && x.AppVersion == "0.4.4" ? 1 : 0,
                Android050 = x.IsAndroid == true && x.AppVersion == "0.5.0" ? 1 : 0,
                IOS043 = x.IsIos == true && x.AppVersion == "0.4.3" ? 1 : 0,
                IOS044 = x.IsIos == true && x.AppVersion == "0.4.4" ? 1 : 0,
                IOS050 = x.IsIos == true && x.AppVersion == "0.5.0" ? 1 : 0,
            })
            .GroupBy(x => x.DateYYMMDD)
            .OrderBy(g => g.Key)
            .Select(g => new AppVersionModel
            {
                DateYYMMDD = g.Key,
                Android043 = g.Count(),
                Android044 = g.Count(),
                Android050 = g.Count(),
                IOS043 = g.Count(),
                IOS044 = g.Count(),
                IOS050 = g.Count()
            })
            .ToList());

Может кто-нибудь дать мне совет, что я могу делать неправильно.

Вот некоторые примеры данных

Date      IsAndroid   IsIOS   AppVersion
01012020  true        false   0.4.4
01012020  true        false   0.4.3
01012020  true        false   0.4.4
01012020  false       true    0.4.3
01012020  false       true    0.4.3
01012020  false       true    0.4.4

Желаемый выход

Date      Android043  Android044  IOS043   IOS044

01012020      1           2         2         1        

1 Ответ

2 голосов
/ 20 марта 2020

Функция Count только:

Возвращает количество элементов в последовательности.

То, что вы хотите сделать, это подсчитать количество элементов в последовательность, которая соответствует определенному условию. Для этого используйте переопределение и принимает предикат :

.Select(g => new AppVersionModel {
    DateYYMMDD = g.Key,
    Android043 = g.Count(i => i.Android043 == 1),
    Android044 = g.Count(i => i.Android044 == 1),
    // ....
})

Поскольку вы убедились, что свойства имеют значения 0,1, вы также можете просто использовать Sum:

.Select(g => new AppVersionModel {
    DateYYMMDD = g.Key,
    Android043 = g.Sum(i => i.Android043),
    Android044 = g.Sum(i => i.Android044),
    // ....
})

Однако я бы go применил иной подход, чтобы свойства хранили булевы значения, как показано ниже. Кроме того, не нужно писать x.BOOLEAN_PROPERTY == true, просто напишите x.BOOLEAN_PROPERTY.

.Select(x => new AppVersionModel {
    DateYYMMDD = x.DateYYMMDD,
    Android043 = x.IsAndroid && x.AppVersion == "0.4.3",
    Android044 = x.IsAndroid && x.AppVersion == "0.4.4",
    Android050 = x.IsAndroid && x.AppVersion == "0.5.0",
    IOS043 = x.IsIos && x.AppVersion == "0.4.3",
    IOS044 = x.IsIos && x.AppVersion == "0.4.4",
    IOS050 = x.IsIos && x.AppVersion == "0.5.0",
})
.GroupBy(x => x.DateYYMMDD)
.OrderBy(g => g.Key)
.Select(g => new AppVersionModel {
    DateYYMMDD = g.Key,
    Android043 = g.Count(i => i.Android043),
    Android044 = g.Count(i => i.Android44),
    // ...
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...