簡體   English   中英

如何將包含每個用戶的輸贏數據的 json 排序為 C# 中的鍵?

[英]How can I sort a json that contains win and loss data for each user as a key in C#?

現在,我有一個 json,例如

{
  "Bob": {
    "Wins": 4,
    "Loses" : 5
  },
  "Dave": {
    "Wins": 8,
    "Loses" : 2
  },
  "Mike": {
    "Wins": 4,
    "Loses" : 2
  }
}

我想首先按獲勝次數對每個玩家進行排序,如果兩個或更多玩家的獲勝次數相同,那么失敗次數最少的玩家排名更高。 對於此示例,它將是 Dave、Mike、Bob。 是否有一個LINQ查詢可以用來有效地對此進行排序? 理想情況下,我想要一個按順序返回它們的數組或列表。

您可以將 Json 反序列化為集合,根據需要對其進行排序,然后再次將其序列化。

例如,

var results = JsonConvert.DeserializeObject<Dictionary<string,Result>>(json);
var sortedDictionary = results.Select(kvp => new {User=kvp.Key,Result=kvp.Value})
                              .OrderByDescending(x=>x.Result.Wins)
                              .ThenBy(x=>x.Result.Loses)
                              .ToDictionary(key=>key.User,
                                          value=>new Result
                                                 { 
                                                     Wins = value.Result.Wins,
                                                     Loses=value.Result.Loses
                                                 }
                                            );
var sortedJson = JsonConvert.SerializeObject(sortedDictionary);

結果定義為

public class Result
{
    public int Wins{get;set;}
    public int Loses{get;set;}
}

輸出

{"Dave":{"Wins":8,"Loses":2},"Mike":{"Wins":4,"Loses":2},"Bob":{"Wins":4,"Loses":5}}

將 JSON 的讀取與排序分離為兩個函數:

  • ReadJSon:輸入你的 Json 數據; 輸出包含讀取數據的對象序列
  • 排序:輸入您讀取的 JSON 數據序列,輸出請求的排序

優點是每個方法中的代碼都相當小。 代碼將更容易理解,更容易重用,例如,如果你想用 JSON 做其他事情而不是排序,更容易更改和更容易單元測試。

首先,您需要一個類來存儲玩家的結果:

class PlayerResult
{
    public Name {get; set;}
    ... // possible other properties
    public int Wins {get; set;}
    public int Losses {get; set;}
}

然后您需要一個過程來將 JSON 讀入一系列 PlayerResults:

IEnumerable<PlayerResult> ReadJson(...)
{
    // TODO: implement
}

您如何讀取 JSON 取決於您的輸入:它是一個文件嗎? 一個流? 一個 JsonReader?

如果您不知道如何從類/流中讀取 JSON,請訪問NewtonSoft Json.NET 文檔

一旦你得到了 PlayerResults 的序列,排序就很容易了:

IOrderedEnumerable<PlayerResult> OrderByWinsAndLosses(this IEnumerable<PlayerResult> playerResults)
{
    return playerResults.OrderByDescending(playerResult => playerResult.Wins)
                        .ThenBy(playerResult => playerResult.Losses);
}

OrderByDescending會將獲勝次數最多的玩家放在首位。 The ThenBy將確保如果兩個玩家擁有相同的勝利,那么損失最少的玩家排在第一位。

我返回IOrderedEnumerable而不是IEnumerable以使調用者能夠在調用我的函數后添加 ThenBy 。

用法看起來很像LINQ,可以在OrderByWinsAndLoses前面或后面添加LINQ方法

var result = ReadJson(...)
    .Where(player => player.Name.StartsWith("A")
    .OrderByWinsAndLosses()
    .OrderBy(player => player.Name)
    .ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM