C#中的SortedDictionary

时间:2012-12-06 10:12:10

标签: c# sorteddictionary

我有一个SortedDictionary,我拿着一个特定玩家的点和他旁边的名字。我需要做的是按降序对此进行排序,以便我在字典的第一个位置获胜。我怎么能这样做?

另外,如何在不知道密钥的情况下从列表中获取项目?

SortedDictionary<int, string> dict = new SortedDictionary<int, string>();
dict.Add(player1Pts, playerNames[0]);
dict.Add(player2Pts, playerNames[1]);
dict.Add(player3Pts, playerNames[2]);

感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

使用以分数为关键字的字典并不合理:密钥必须是唯一的,因此如果两个玩家的分数相同,则会失败。

相反,您应该创建一个包含名称和分数的Player类,并在Player中存储List<Player>个对象。如果您需要按分数对玩家进行排序,可以使用自定义比较器在列表中调用Sort,或者只是使用Linq命令结果:

foreach (Player player in players.OrderByDescending(p => p.Score))
{
    // Do something with player
}

答案 1 :(得分:1)

首先:当您插入另一个值时,将始终立即对排序字典进行排序。

但请注意:使用积分作为KEY意味着您不能让玩家拥有EQUAL积分。

但是如果你想要这样做,你可以简单地使用你的词典的Last()方法来获得得分最高的玩家:

SortedDictionary<int, String> t = new SortedDictionary<int,string>();
t.Add(5, "a");
t.Add(10, "c");
t.Add(2, "b");
MessageBox.Show((t.Last<KeyValuePair<int,string>>()).Value);

这将导致“c”。

答案 2 :(得分:0)

首先我认为你应该切换<int, string>玩家名称的位置应该是关键,而积分将是值。

然后你可以按值排序:

dict.Sort(
    delegate(KeyValuePair<int, double> val1,
    KeyValuePair<int, double> val2)
    {
        return val1.Value.CompareTo(val2.Value);
    }
);

您可以通过foreach查看词典以获取键和值:

 foreach (var pair in asd)
            {
                string some = pair.Key;
                int someValue =  pair.Value;
            }

答案 3 :(得分:0)

我的问题的答案是任何可能需要它的人:)

Player player1 = new Player(playerNames[0], player1Pts);
Player player2 = new Player(playerNames[1], player2Pts);
Player player3 = new Player(playerNames[2], player3Pts);
Player player4 = new Player(playerNames[3], player4Pts);
Player player5 = new Player(playerNames[4], player5Pts);

List<Player> players = new List<Player>();

players.Add(player1);
players.Add(player2);
players.Add(player3);
players.Add(player4);
players.Add(player5);

var sortedPlayers = (from Player play in players
                     orderby play.Points descending
                     select play);

List<Player> sortPlay = (List<Player>)sortedPlayers.ToList();

答案 4 :(得分:0)

虽然问题有几个答案,但这些似乎都没有利用SortedDictionary结构。如果您希望将SortedDictionary设计为最大堆而不是默认的最小堆,我认为最好的解决方案是覆盖C#使用的默认比较器。这可以按如下方式完成:

public class DescendingComparer<T>: IComparer<T> where T : IComparable<T>
{
    public int Compare(T x, T y)
    {
        return y.CompareTo(x); //reverses, so compare ascending
                 //this is vs the standard method, which returns x.CompareTo(y)
    }

}

static void Main(string[] args)
{

SortedDictionary<float, string> myDict = new SortedDictionary<float,string>(new DescendingComparer<float>()); //sorts on the key
    string[] name = {"Bill", "Tom", "Susan", "Terry"};
    myDict.Add(.8f, name[0]);
    myDict.Add(.2f, name[1]);
    myDict.Add(.95f, name[2]);
    myDict.Add(.005f, name[4]);

    foreach (KeyValuePair<float, int> j in myDict)
    {
        Console.WriteLine("Key: {0}, Value: {1}",j.Key,j.Value);
    } //now it is stored in increasing order, so accessing largest elements fast
}

另请参见:C#: sort dictionary in descending order