我的数据库中有这些数据
我需要获得最常用的冠军头衔。如何使用LINQ实现这一目标?
这就是我获取数据的方式:
List<List<Masteries.Mastery>> MasteryList = new List<List<Masteries.Mastery>>();
Conex.Command.CommandText = "SELECT masteries FROM matchdetails_participantsdetails_na WHERE championID=@champID;";
Conex.Command.Parameters.AddWithValue("@champID", championID);
using (MySqlDataReader dbReader = Conex.Command.ExecuteReader())
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
while (dbReader.Read())
{
List<Masteries.Mastery> tmpMastery = new List<Masteries.Mastery>();
tmpMastery = serializer.Deserialize<List<Masteries.Mastery>>(dbReader.GetString("masteries"));
MasteryList.Add(tmpMastery);
}
}
掌握课程
class Mastery
{
public int ID
{
set; get;
}
public byte Rank
{
set; get;
}
}
答案 0 :(得分:0)
根据我的理解,您希望获得具有最大计数的内部列表所在的外部列表?
List<Mastery> maxList = new List<Mastery>();
var max = 0;
foreach (var list in MasteryList)
{
var masteryList = list
.GroupBy(gp => new { gp.ID, gp.Rank }) // Agrupamos por ID y Rango
.OrderByDescending(g => g.Count()) // Ordenamos de mayor a menor
.Select(x => new { Key = x.Key, Count = x.Count() }) // Seleccionamos el valor y la cantidad de repeticiones
.ToList();
var maxCurrent = masteryList.Max(x => x.Count);
if (max < maxCurrent)
{
maxList = list;
max = maxCurrent;
}
}
如果是这种情况,那么您应该创建一个类ConfigurationMastery
并使用List<ConfigurationMastery>
而不是List<List<Mastery>>
。您可以更轻松地使用此课程。上面的代码可以简化为仅使用linq。
答案 1 :(得分:0)
我认为我明白你想要什么。所以,你有一个List列表,每个项目都是一个包含10个名人的列表。这些杰作中的每一个都包含ID和等级。
您希望通过ID和排名分组来获得最受欢迎的精通,因为这构成了配置。最后,您希望首先使用最常出现的配置来排序列表。试试这个:
var configurations = MasteryList.SelectMany(s => s)
.GroupBy(gp => new {gp.ID, gp.Rank} )
.OrderByDescending(g => g.Count())
.Select(x => new {
Id = x.Key.ID,
rank = x.Key.Rank,
count = x.Count()
})
.ToList();