C# Linq Select将为类似值生成并列分数
我正在尝试生成一个简单的排名表,其中包含基于分数的位置编号 e、 g.鉴于以下情况:C# Linq Select将为类似值生成并列分数,c#,.net,linq,select,.net-4.5,C#,.net,Linq,Select,.net 4.5,我正在尝试生成一个简单的排名表,其中包含基于分数的位置编号 e、 g.鉴于以下情况: List<Player> players = new List<Player>() { new Player { Name = "John", Score = 2 }, new Player { Name = "Mary", Score = 1 }, new Player { Name = "Bob", Score = 2 }, new Player {
List<Player> players = new List<Player>() {
new Player { Name = "John", Score = 2 },
new Player { Name = "Mary", Score = 1 },
new Player { Name = "Bob", Score = 2 },
new Player { Name = "Alice", Score = 3 },
};
var results = players
.OrderByDescending(o => o.Score)
.Select((v,i) => new { Name = v.Name, Score = v.Score, Position = i+1} );
相反,我希望结果是
Name Score Pos
Alice 3 1
John 2 2
Bob 2 2 <---- this guy is tied for second
Mary 1 4 <---- this one still comes fourth
Name评分位置
爱丽丝31
约翰2 2
bob2对于索引select语句,您几乎有了解决方案,但首先要对数据集进行排序
编辑:做了一个小编辑,因为我把分拣机按错误的顺序排序,即按升序排序
List<Player> players = new List<Player>() {
new Player { Name = "John", Score = 2 },
new Player { Name = "Mary", Score = 1 },
new Player { Name = "Bob", Score = 2 },
new Player { Name = "Alice", Score = 3 },
};
players.Sort(delegate(Player x, Player y)
{
return y.Score.CompareTo(x.Score);
});
var results = players
.Select((v,i) => new {
Name = v.Name,
Score = v.Score,
Position = i+1,
TiedWithPrevious = i > 0 && players[i-1].Score == v.Score,
TiedWithNext = i < players.Count-1 && players[i+1].Score == v.Score } );
List players=新列表(){
新玩家{Name=“John”,得分=2},
新玩家{Name=“Mary”,得分=1},
新玩家{Name=“Bob”,得分=2},
新玩家{Name=“Alice”,得分=3},
};
玩家排序(代理(玩家x,玩家y)
{
返回y.Score.CompareTo(x.Score);
});
var结果=玩家
.选择((v,i)=>新建{
Name=v.Name,
分数,
位置=i+1,
第二组,前一组=i>0&&players[i-1]。得分==v.得分,
TiedWithNext=i
但听起来你想按/selectmany进行分组
var results = players
.OrderByDescending(o => o.Score)
.GroupBy(o => o.Score)
.SelectMany((l, i) => l.Select(v => new { Name = v.Name, Score = v.Score, Position = i + 1 }));
像这样的东西对你有用吗
.Select((v,i) => new { Name = v.Name,
Score = v.Score,
Position =
players.Count(p => p.Score > v.Score) + 1
}
);
你比我赢了一点。这很有效。(刚刚在林帕德试过)。忘了带索引的SelectMany,试着在GroupBy中这样做。这一个显示Mary在第三位,而她应该是第四位@JamesCurran我也试着在linqpad和GroupBy一起发布它。但是他击败了我们:(+1 ed:)很接近,但是mary应该是第四名,而不是第三名。TiedWithNext和TiedWithPrevious给出了相同的值,TiedWithPrevious是不正确的。啊,我看到排序顺序是向后的,我已经更新了排序委托。现在看起来不错。我只是在得分更高的球员的数量上加1来计算位置。顺便说一下,(v,I)中不再需要索引I。
.Select((v,i) => new { Name = v.Name,
Score = v.Score,
Position =
players.Count(p => p.Score > v.Score) + 1
}
);