根据值获取列表中物品的索引
该场景适用于足球联赛桌。我可以按比赛胜利率排列名单,然后通过进球得分来确定他们在联盟中的位置。然后,我使用这个顺序,使用IndexOf
函数获得球队在联盟表中的位置。根据值获取列表中物品的索引
this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals);
this.results.Foreach(x => x.Position = this.results.IndexOf(x));
问题出现时,两支球队(应联合#1)具有相同的比赛胜率和进球,但得到的指数一队时,将被分配#1和#等2。
有没有办法获得正确的位置?
var position = 1;
var last = result.First();
foreach(var team in results)
{
if (team.WinPercentage != last.WinPercentage || team.Goals != last.Goals)
++position;
team.Position = position;
last = team;
}
我认为该职位需要在if语句中分配给团队? –
你没错。 * if()'之后,位置分配需要*。我修复了它。 –
你可以做的是组基础上,胜率和目标(如果两者相同,两队将在同一组)的项目,然后应用相同的位置数的每个元素在同组:
this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals);
var positionGroups = this.results.GroupBy(x => new { WinPercentage = x.WinPercentage, Goals = x.Goals });
int position = 1;
foreach (var positionGroup in positionGroups)
{
foreach (var team in positionGroup)
{
team.Position = position;
}
position++;
}
这是我正在考虑这样做的方式(与小组一起),但我想知道是因为它只包含一个foreach语句的James Currans回答下面更有效率 –
@BadDub他的答案肯定是更有效率,如果这就是你寻找。我只是想提供另一种选择。尽管'GroupBy'不是解决这个问题的最佳解决方案,你现在可能会记住它存在并且已经存在于你的曲目中。 – cubrr
感谢您的回复! –
下面的代码的代码会为你
this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals);
this.results.Foreach(x =>
{
int index = this.results.FindIndex(y => y.Goals == x.Goals && y.WinPercentage == x.WinPercentage);
x.Position = index > 0 ? this.results[index - 1].Position + 1 : 0;
});
我猜你的问题有没有解决办法,如果一旦两个项目(ANY)在列表中的相同比分,你永远是可行的有一个在另一个之后。你必须为两个相同的分数制定一个同样的列表位置的方法:我建议你创建一个二维数组或LIST,其中一个值是数字位置,并且放弃LIST位置作为联盟中每个队的索引。 –
是的,这就是为什么我发布这个问题,因为我目前的方法不起作用。我希望能够用其他可能的解决方案指出正确的方向。 –