我刚开始学习WPF / C#,我选择了一个对我有用的项目,而不是“Hello,World!”的变体。程序
这是一个小应用程序,可以轮询游戏服务器以获取玩家信息并将其绑定到DataGrid
。数据按团队分组,可以是以下四个值之一:蓝色,红色,旁观者或无。
我的Linq查询工作正常,DataGrid
分组几乎是好的,除了一个小问题:四个团队组的顺序每次都不同。有时红色是第一个,有时是无等等。
我有什么办法可以强迫小组进入上面的顺序吗?
这是Linq查询(addr是服务器ip):
private void get_server(string addr)
{
var loc = "http://ukcs.gameme.com/api/serverinfo/" + addr + "//players";
XDocument doc = XDocument.Load(@loc);
var server = new ObservableCollection<Player>
(from player in doc.Descendants("player")
orderby player.Element("rank").Value
select new Player
{
name = player.Element("name").Value,
team = player.Element("team").Value,
frags = player.Element("kills").Value + ":" + player.Element("deaths").Value,
rank = int.Parse(player.Element("rank").Value)
});
server.OrderBy(p => p.rank);
ListCollectionView collection = new ListCollectionView(server);
collection.GroupDescriptions.Add(new PropertyGroupDescription("team"));
player_list.ItemsSource = collection;
}
第二个问题是OrderBys似乎都没有效果。
任何帮助将不胜感激!
答案 0 :(得分:2)
首先回答你的上一个问题:) OrderBy在这里没有任何意义,因为在对玩家进行排序之后,你将列表放在一个CollectionView中,并使用一个分组迅速对其进行排序(因为分组在Team上)。
要按顺序获取它们,您可以在将它们放入ListCollectionView之前按Team对它们进行排序。但是,这将按字母顺序排列 - 而不是您想要的顺序。你需要实现IComparable并把它放在你的sort方法中 - 我已经重写了你的方法(我不太擅长那个Linq形式 - 所以,请耐心等待:):
你通过引入一些不必要的东西让自己变得有点困难 - 我试图将它们解决掉。
private void get_server(string addr)
{
var loc = "http://ukcs.gameme.com/api/serverinfo/" + addr + "//players";
var doc = XDocument.Load(@loc);
var server = doc.Descendants("player")
.Select(player => new Player
{
name =player.Element("name").Value,
team=player.Element("team").Value,
frags=player.Element("kills").Value +":" +player.Element("deaths").Value,
rank=int.Parse(player.Element("rank").Value)
})
.OrderBy(p => p.team,new CustomSort())
.ThenBy(p => p.rank).ToList();
var collection = new ListCollectionView(server);
collection.GroupDescriptions.Add(new PropertyGroupDescription("team"));
player_list.ItemsSource = collection;
}
public class CustomSort : IComparer<string>
{
public int Compare(string x, string y)
{
if (x.Equals(y))
return 0;
if (y.Equals("None") || x.Equals("Blue"))
return 1;
if (x.Equals("None") || y.Equals("Blue"))
return -1;
if (x.Equals("Red")|| y.Equals("Spectator"))
return -1;
return 1; // y == "Red" and x == "Spectator"
}
}
希望这有帮助!