从不同的结果中找出最受欢迎的

时间:2011-02-17 04:32:01

标签: c# algorithm math

这更像是一个数学问题,而不是一个编程问题,但它仍然包括一些编程。

该程序从IMDB网站上的用户列表中删除信息,并且应该显示所有输入列表中最受欢迎的名人。这样做,只显示不准确的结果。

这就是我所拥有的:

            public List<Star[]> stars = new List<Star[]>();

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Processing...";
        stars.Add(ParseList(textBox1.Text));

        label1.Text = "Waiting.";

        treeView1.Nodes.Clear();

        List<Star> strs = new List<Star>();

        foreach (Star[] stlst in stars)
        {
            foreach (Star s in stlst)
            {
                bool inalrdy = false;

                int index = 0;

                for (int i = 0; i < strs.Count; i++)
                {
                    if (s.Name == strs[i].Name)
                    {
                        inalrdy = true;
                        index = i;
                        break;
                    }
                }

                if (inalrdy)
                {
                    strs[index].Points += s.Points;
                }
                else
                {
                    strs.Add(s);
                }
            }
        }

        foreach (Star s in strs)
        {
            treeView1.Nodes.Add(s.Points + ". " + s.Name);
        }


    }

即使没有相同的玩家,我还能做些什么才能准确地对它们进行排名?

这对我来说非常重要,我将非常感谢你的回答。

2 个答案:

答案 0 :(得分:0)

你有每个名单的球员关系,但你想要的是球员整体的关系。 假设这是可以解决的(即有信息对每个玩家进行排名,并且没有玩家1和2互相打败的情况)

该算法看起来像:

  1. 获取第一个列表中的第一个排名玩家。遍历每个剩余列表的第一个元素,看看该玩家是否被打败。如果是,请由击败他的球员替换,否则他是第一。

  2. 从列表中删除该播放器。

  3. 从1开始重复。

答案 1 :(得分:0)

好的,某些LINQ怎么样?

这样的东西
public class Player
{
    public string Name;
    public double Rank;
}

List<List<Player>> someOtherList = new List<List<Player>>
                                   {
                                       new List<Player> 
                                           {
                                               new Player {Name = "A", Rank = 1}, 
                                               new Player {Name = "B", Rank = 2}
                                           },
                                       new List<Player>
                                           {
                                               new Player {Name = "A", Rank = 2}, 
                                               new Player {Name = "C", Rank = 1}
                                           }
                                   };

List<Player> plrs = 
        (from p in someOtherList.SelectMany(singleList => singleList)
        group p by p.Name into g
         select new Player { Name = g.Key, Rank = g.Average(x => x.Rank) })
         .OrderBy(x => x.Rank)
         .ToList();

foreach (Player p in plrs)
{
    OverallPlayers.Add(p.Rank + ". " + p.Name);
}

修改

改为看起来像OP代码。我会强烈建议你在感觉更好的时候花一些时间在LINQ教程上......

List<Star[]> stars = new List<Star[]>
                                       {
                                           new[]
                                               {
                                                   new Star {Name = "A", Points = 1}, 
                                                   new Star {Name = "B", Points = 2}
                                               },
                                           new[]
                                               {
                                                   new Star {Name = "A", Points = 2}, 
                                                   new Star {Name = "C", Points = 1}
                                               }
                                       };
List<Star> plrs =
        (from p in stars.SelectMany(singleList => singleList)
        group p by p.Name into g
         select new Star { Name = g.Key, Points = g.Average(x => x.Points) })
         .OrderBy(x => x.Points)
         .ToList();

foreach (Star p in plrs)
{
    //OverallPlayers.Add(p.Rank + ". " + p.Name);
}