从对象列表中获取最常见的值/模式

时间:2016-10-19 12:54:43

标签: c# linq

更新2:更简洁

我的数据库中有这些数据

Masteries and Rank

我需要获得最常用的冠军头衔。如何使用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;
    }
}

2 个答案:

答案 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();