Как сделать GroupBy со списком и возврат списка в C#? - PullRequest
0 голосов
/ 01 апреля 2020

Это продолжение предыдущего вопроса ( Как назначить JSON элементов для двумерного массива в L oop), который я задал. Мои данные начинаются с JSON объекта:

JSON
    {"page":"1",
     "per_page":10,
     "total":100,
     "total_pages":10,
     "data":[{"id":1,
              "userId":1,
              "userName":"Jim Silver", 
              "timestamp":16425382171,
              "txnType":"debit",
              "amount":"$1,000.07",
              "location":{"id":2,
                          "address":"654, Somewhere, Some Street", 
                          "city":"Some City",
                          "zipCode":12345},
                          "ip":"202.210.105.105"},
             {"id":2," ...}
             {"id":3," ...}
              ...
             {"id":n," ...}]

Мне нужно получить идентификатор пользователя и сумму в List<List<int>>, что я сделал здесь:

var model = JsonConvert.DeserializeObject<TxnResponse>(rawJSON);
var elements = model.data;

List<List<int>> userTxns = new List<List<int>>(elements.Count);
List<int> record = null;

int userID = 0;
int userAmount = 0;

for (int row = 0; row < elements.Count; row++)
{
    userID = elements[row].userId;
    userAmount = Convert.ToInt32(Math.Floor(decimal.Parse(model.data[row].amount, System.Globalization.NumberStyles.Currency)));

    record = new List<int>();
    record.Add(userID);
    record.Add(userAmount);

    userTxns.Add(record);
}

return userTxns.GroupBy();

результат должен выглядеть следующим образом при выводе на экран (Console.WriteLine(String.Join("\n", list.Select(x => String.Join(" ", x))));): 1 1000 2 2000 3 3000 4 4000

Без группировки По, если объект JSON имеет 10 элементов данных, у меня есть 10 идентификаторов пользователей, количество записей. Я пытался return userTxns.GroupBy(userID); и return userTxns.GroupBy(u => userID);, но получить "аргументы типа для метода не могут быть выведены из использования ..." или "Не удается неявно преобразовать тип ...".

Модель:

  public class TxnResponse
    {
        public string page { get; set; }
        public int per_page { get; set; }
        public int total { get; set; }
        public int total_pages { get; set; }
        public List<data> data { get; set; }
    }


    public class data
    {
        public int id { get; set; }
        public int userId { get; set; }
        public string userName { get; set; }
        public object timestamp { get; set; }
        public string txnType { get; set; }
        public string amount { get; set; }
        public Location location { get; set; }
        public string ip { get; set; }
    }
public class Location
    {
        public int LocationID { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public int ZipCode { get; set; }
    }

Как сделать GroupBy по идентификатору пользователя? Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2020

Это работает ...

return userTxns.GroupBy(u => u[0], (key, values) => new List<int>
{
    key,
    values.Select(l => l[1]).Sum()
}).OrderBy(u => u[0]).ToList();

, но есть 16 страниц данных, и мой вызов REST возвращает только первую страницу ... Я опубликую следующий вопрос.

...