这更像是一个数学问题,而不是一个编程问题,但它仍然包括一些编程。
该程序从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);
}
}
即使没有相同的玩家,我还能做些什么才能准确地对它们进行排名?
这对我来说非常重要,我将非常感谢你的回答。
答案 0 :(得分:0)
你有每个名单的球员关系,但你想要的是球员整体的关系。 假设这是可以解决的(即有信息对每个玩家进行排名,并且没有玩家1和2互相打败的情况)
该算法看起来像:
获取第一个列表中的第一个排名玩家。遍历每个剩余列表的第一个元素,看看该玩家是否被打败。如果是,请由击败他的球员替换,否则他是第一。
从列表中删除该播放器。
从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);
}