Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中对包含每个用户的赢家和输家数据的json进行排序?_C#_Json_Linq - Fatal编程技术网

如何在C#中对包含每个用户的赢家和输家数据的json进行排序?

如何在C#中对包含每个用户的赢家和输家数据的json进行排序?,c#,json,linq,C#,Json,Linq,现在,我有一个json,比如 { "Bob": { "Wins": 4, "Loses" : 5 }, "Dave": { "Wins": 8, "Loses" : 2 }, "Mike": { "Wins": 4, "Loses" : 2 } } 我想先按赢的次数对每个玩家进行排序,如果两个或两个以上的玩家有相同的赢的次数,那么损失最少的玩家排名会更高。在这个例子中,它将是戴夫,迈克,鲍勃。是否有一个LINQ查询可以用来

现在,我有一个json,比如

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

我想先按赢的次数对每个玩家进行排序,如果两个或两个以上的玩家有相同的赢的次数,那么损失最少的玩家排名会更高。在这个例子中,它将是戴夫,迈克,鲍勃。是否有一个
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);
输出

{"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
}

1.设计一个类来保存您的数据,然后将您的JSON数据序列化到这个类,然后2。使用
linq
对类进行排序。分别用谷歌搜索这两个选项将告诉你该做什么,并希望有助于学习,而不是让别人为你编写代码。
IEnumerable<PlayerResult> ReadJson(...)
{
    // TODO: implement
}
IOrderedEnumerable<PlayerResult> OrderByWinsAndLosses(this IEnumerable<PlayerResult> playerResults)
{
    return playerResults.OrderByDescending(playerResult => playerResult.Wins)
                        .ThenBy(playerResult => playerResult.Losses);
}
var result = ReadJson(...)
    .Where(player => player.Name.StartsWith("A")
    .OrderByWinsAndLosses()
    .OrderBy(player => player.Name)
    .ToList();