[英]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 的讀取與排序分離為兩個函數:
優點是每個方法中的代碼都相當小。 代碼將更容易理解,更容易重用,例如,如果你想用 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.