2017-05-26 74 views
0

该场景适用于足球联赛桌。我可以按比赛胜利率排列名单,然后通过进球得分来确定他们在联盟中的位置。然后,我使用这个顺序,使用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。

有没有办法获得正确的位置?

+0

我猜你的问题有没有解决办法,如果一旦两个项目(ANY)在列表中的相同比分,你永远是可行的有一个在另一个之后。你必须为两个相同的分数制定一个同样的列表位置的方法:我建议你创建一个二维数组或LIST,其中一个值是数字位置,并且放弃LIST位置作为联盟中每个队的索引。 –

+0

是的,这就是为什么我发布这个问题,因为我目前的方法不起作用。我希望能够用其他可能的解决方案指出正确的方向。 –

回答

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; 
} 
+0

我认为该职位需要在if语句中分配给团队? –

+1

你没错。 * if()'之后,位置分配需要*。我修复了它。 –

1

你可以做的是组基础上,胜率和目标(如果两者相同,两队将在同一组)的项目,然后应用相同的位置数的每个元素在同组:

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++; 
} 
+0

这是我正在考虑这样做的方式(与小组一起),但我想知道是因为它只包含一个foreach语句的James Currans回答下面更有效率 –

+1

@BadDub他的答案肯定是更有效率,如果这就是你寻找。我只是想提供另一种选择。尽管'GroupBy'不是解决这个问题的最佳解决方案,你现在可能会记住它存在并且已经存在于你的曲目中。 – cubrr

+1

感谢您的回复! –

1

下面的代码的代码会为你

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; 
});