我有一个SortedDictionary,我拿着一个特定玩家的点和他旁边的名字。我需要做的是按降序对此进行排序,以便我在字典的第一个位置获胜。我怎么能这样做?
另外,如何在不知道密钥的情况下从列表中获取项目?
SortedDictionary<int, string> dict = new SortedDictionary<int, string>();
dict.Add(player1Pts, playerNames[0]);
dict.Add(player2Pts, playerNames[1]);
dict.Add(player3Pts, playerNames[2]);
感谢您的帮助!
答案 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
}