Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Select将为类似值生成并列分数_C#_.net_Linq_Select_.net 4.5 - Fatal编程技术网

C# Linq Select将为类似值生成并列分数

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 {

我正在尝试生成一个简单的排名表,其中包含基于分数的位置编号

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