2013-09-26 78 views
1

我无法完全整理我的列表。这是基于int的排序,我使用了CompareTo()形式的IComparable,自定义Comparer委托和匿名委托。这对我来说没有任何作用。如何更改列表排序以正确排序

这里是代码:

[TestMethod] 
    public void SortingPlayersFirst() 
    { 
     //arrange 
     Player player = new Player("neosb"); 
     Player player2 = new Player("simone"); 
     Player player3 = new Player("Alice"); 
     player.Score = 5; 
     player2.Score = 2; 
     player3.Score = 10; 
     Players players = new Players(); 
     players.Add(player); 
     players.Add(player2); 
     players.Add(player3); 

     //I have tried this one 
     players.Sort(Player.ComparePlayersByScore); 
     //and this one 
     players.Sort() 
     // and this one 
     IComparer<Player> comp = Comparer<Player>.Create(
     (p1, p2) => p1.Score.CompareTo(p2.Score)); 
     players.Sort(comp); 

     //this one fails the test 
     Assert.AreEqual(player3, players[0], "Highest score is not first"); 
     //however this one passes the test 
     Assert.AreNotEqual(player2, players[2], "Lowest score is not last"); 
    } 

public class Players : List<Player> 
    { 

    } 

public class Player : IComparable<Player>, IEquatable<Player> 
    { 
    public string Name { get; set; } 
    public int Score { get; set; } 

    public Player(string name) 
    { 
     Name = name; 
     Score = 0; 
    } 

    public int CompareTo(Player other) 
    { 
     return Score.CompareTo(other.Score); 
    } 

    public static int ComparePlayersByScore(Player player1, Player player2) 
    { 
     if (player1.Score > player2.Score) 
     return 1; 
     else if (player1.Score < player2.Score) 
     return -1; 
     else 
     return 0; 
    } 
    } 

我有什么做的,对此列表进行排序,并通过单元测试,以及为什么它的部分进行排序。

+1

只是一个侧面说明 - 测试'List.Sort'似乎是多余的。它已经通过微软测试。测试'CompareTo'和'ComparePlayersByScore'方法只需要两个'Player's,这将是一个更容易阅读和理解的测试。 – Default

+0

你的比较器在哪里? –

+0

比较器是在播放器类 - ComparePlayersByScore(),我知道它应该在委托类外,但为了简单起见,我把它放在 – simone

回答

6

你在上升顺序排序它,而不是降...但你的测试要求最高进球的球员是第一次。这应该工作:

// Use the overload taking a Comparer<Player> delegate for simplicity 
players.Sort((p1, p2) => p2.Score.CompareTo(p1.Score)); 

注意在lambda表达式中使用的p1p2的逆转 - 这就是你如何扭转比较。

+0

除了按升序排序,我写了坏的第二个断言,其中是Assert.AreNotEqual(),应该是Assert.AreEqual(),当我有一个球员时,它引起了我的困惑。因此list.Reverse()没有通过测试。谢谢,你今天早上把我吵醒了。 – simone