Поиск минимума и максимума столбца для каждого идентичного значения в другом столбце - PullRequest
0 голосов
/ 09 мая 2020

У меня есть таблица в файле EXCEL следующим образом (я могу прочитать файл Excel, это не проблема здесь) -

+------------+-------+-------------+--------+-------+
|    Date    | RefNo | MasterName  | Value  | Type  |
+------------+-------+-------------+--------+-------+
| 01-01-2020 | 45    | ABC Pty Ltd | 123.45 | Sales |
| 01-01-2020 |  2    | XYZ Ltd     | 134.5  | Sales |
| 01-01-2020 | 46    | ABC Pty Ltd | 765    | Sales |
| 01-01-2020 | 47    | ABC Pty Ltd | 465.4  | Sales |
| 01-01-2020 | 3     | XYZ Ltd     | 468    | Sales |
| 01-01-2020 | S_1   | ABC Pty Ltd | 678    | Sales |
| 01-01-2020 | S_2   | XYZ Ltd     | 68     | Sales |
+------------+-------+-------------+--------+-------+

Я использую следующий запрос, чтобы получить общую сумму по каждому Master 'для каждого дня (пример таблицы имеет только один день продаж) -

var query = data.GroupBy(row => new { row.Date, row.MasterName, row.Type })
    .Select(grp => new MasterAccount
    {
        Date = grp.Key.Date,
        Name = grp.Key.MasterName,
        Type = grp.Key.Type,
        Amount = grp.Sum(c => c.Value)
        MinRef = // Get minimum ref no. (type: int)
        MaxRef = // Get maximum ref no. (type: int)
    });

Примечание: Как видите, прямо сейчас мой код не получает Столбец RefNo при выполнении 'GroupBy', потому что если я это сделаю, то для каждого RefNo будет создан новый MasterAccount. И мне это не нужно.

Я хочу получить MinRef и MaxRef для каждого мастера . Таким образом, в случае « AB C Pty Ltd » это будет 45 и 47 соответственно, игнорируя строку « S_1 ». Возможно, используйте TryParse, чтобы убедиться, что это не строка, которую нельзя преобразовать в int.

Но я не уверен, как реализовать это в этом коде.

1 Ответ

1 голос
/ 09 мая 2020

Определить функцию, которая преобразует строку в int? (null, если преобразование невозможно)

    private int? StrToInt(string s)
    {
        int i;
        if (int.TryParse(s, out i))
            return i;
        else
            return null;
    }

, а затем используйте его в выражении LINQ:

    MinRef = grp.Min(i => StrToInt(i.RefNo).GetValueOrDefault(0),
    MaxRef = grp.Max(i => StrToInt(i.RefNo).GetValueOrDefault(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...