窗口窗体c#对房间列表进行排序,该列表为字符串
我从我们的一个开发者那里接管了一个项目 我们有一个窗口表单,用于发送一个字符串,用户可以访问该字符串的openfire聊天室 一些房间被命名为“AAA房间1”和“AAA房间2”等。 如果我使用此代码,它将按“AAA房间1”“AAA房间11”对其进行排序,然后在“AAA房间19”之后是“AAA房间2” 所以我想按正确的顺序(1,2,3,4,5,6,7,8,9,10,11,12)对房间列表进行排序,并正确排序窗口窗体c#对房间列表进行排序,该列表为字符串,c#,wpf,visual-studio-2008,xmpp,C#,Wpf,Visual Studio 2008,Xmpp,我从我们的一个开发者那里接管了一个项目 我们有一个窗口表单,用于发送一个字符串,用户可以访问该字符串的openfire聊天室 一些房间被命名为“AAA房间1”和“AAA房间2”等。 如果我使用此代码,它将按“AAA房间1”“AAA房间11”对其进行排序,然后在“AAA房间19”之后是“AAA房间2” 所以我想按正确的顺序(1,2,3,4,5,6,7,8,9,10,11,12)对房间列表进行排序,并正确排序 foreach (Room r in Rooms) { if (r.Name.Co
foreach (Room r in Rooms)
{
if (r.Name.Contains("AAA") && r.Name.Length <= 7)
RoomList.Items.Add(r.Name, IsMember(r.ID));
}
foreach (Room r in Rooms)
{
if (r.Name.Contains("AAA") && r.Name.Length > 7)
RoomList.Items.Add(r.Name, IsMember(r.ID));
}
foreach (Room r in Rooms)
{
if (!r.Name.Contains("AAA"))
RoomList.Items.Add(r.Name, IsMember(r.ID));
}
请理解,我是这个开发的新手,所以我需要一些帮助,帮助我在检索和保存时如何正确排序
此外,如果用户将支票放入某些房间,我希望能够有一个弹出窗口。首先,让我们稍微重构一下代码,因为它很难阅读:
private int RoomWeight(Room r) {
if (r.Name.Contains("AAA")) {
if (r.Name.Length > 7) return 2;
return 1;
}
return 3;
}
然后,您可以使用一行对房间进行排序:var sortedRooms=rooms.OrderBy(x=>RoomWeight(x)).ToList()代码>
下一步是解析房间名称,并根据您的新需求计算RoomWeight值
最后,您需要使用已排序的房间列表来填充RoomList.Items列表,您可以使用与之前相同的方法来完成此操作:
foreach (var r in sortedRooms) {
RoomList.Items.Add(r.Name, IsMember(r.ID));
}
希望这将有助于在我看来,将此视为一个长度问题来确定先排序哪个房间是错误的。如果房间名称的模式为{room-name}{room\u NUMBER}
,则将其视为相同的模式。(尽管有时我很不愿意这样说:这可能是正则表达式的工作!)
此代码生成以下输出
AAA房间1
AAA房间2
AAA房间5
AAA房间10
AAA房间14
BBB房间3
BBB 12室
CCC 5室
CCC 10室
使用此方法,我们将玫瑰称为玫瑰(或者,具体地说,是数字的字符串表示)。我使用了匿名类型,这样我就不必进行两次比赛
编辑:我注意到您说的是Visual Studio 2008,所以您可能没有使用.NET 4.0。如果不是,那么多行lambda可能不起作用(我不记得确切是什么时候添加的)。这里有另一种使用两个正则表达式且不使用匿名类型的方法。我不确定我是否更喜欢这种方式,反正现在我已经写好了
var rooms = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
Regex prefix = new Regex(@"^\D+");
Regex suffix = new Regex(@"\d+$");
var ordered2 = rooms
.OrderBy(r => prefix.Match(r).Value)
.ThenBy(r => Convert.ToInt32(suffix.Match(r).Value));
foreach (var room in ordered2)
{
Console.WriteLine(room);
}
此外,我可能会注意到,在这段代码中,显然没有因名称匹配失败而出现意外情况。如果有可能的话,那就需要内置
最后,既然你说你是开发新手,我将很快地讨论正则表达式:
^\D+
=从字符串的开头,多次为我查找非数字的内容
\d+$
=为我找到一组紧跟字符串末尾的一个或多个数字
编辑2:我想我没有回答你的第二个问题。答案可能会有很大的不同,这取决于表单是如何从文件室列表初始化的,您是如何存储复选框的,您希望如何处理它,存在哪些其他数据结构来保存其余的信息等等。我想您需要字母数字排序(也可以用于其他带有数字的排序)
请尝试此快速解决方案:
字母数字排序
你的问题的用途
var unordered = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
var ordered = unordered.OrderBy(s => s, new AlphanumComparatorFast());
结果如下
AAA ROOM 1
AAA ROOM 2
AAA ROOM 5
AAA ROOM 10
AAA ROOM 14
BBB ROOM 3
BBB ROOM 12
CCC ROOM 5
CCC ROOM 10
下面是一篇关于这个问题的好文章:
人类排序:自然排序顺序
听起来您需要定制比较器;例如,如果房间采用特定格式,您的自定义比较器可以在已知点后拆分,然后按房间索引排序。所以,如果你有AAA房间1,AAA房间2,AA房间1,那么如果你在“房间”后拆分,然后按组件排序,这可能会满足你的需要。你看到我的答案了吗?您可以使用自定义的字母数字比较器。我正在尝试使用它,现在我收到一个错误,提示“名称“OrderBy”在当前上下文中不存在”(1)您使用的是.NET的哪个版本?(2) 假设它支持LINQ,您将需要一个使用System.LINQ代码>在顶部。我不记得LINQ东西是否存在于System
或System.Core
或其他地方,因此您可能还需要添加一个引用。我在2上。net(项目就是这样交给我的)我注意到,如果我改为3.5,我就不会犯这个错误(孩子,我有一些学习要做),有什么方法可以做到这一点吗?有什么方法可以简单地将列表变成字符串吗?因为Web服务的信息是字符串形式的,所以假设你有权访问room1,它实际上只是一个1,如果你有权访问Room28,那么它的号码是28,。XML字段看起来是这样的1,7,8,24我可以自己创建列表吗?我还应该提到,当前让我知道该成员是哪个房间的成员的代码是private bool IsMember(int i){string[]parts;char[]seps={','};parts=MasterRecord.User.Memberships.Split(seps);for(int x=0;xvar rooms = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
Regex prefix = new Regex(@"^\D+");
Regex suffix = new Regex(@"\d+$");
var ordered2 = rooms
.OrderBy(r => prefix.Match(r).Value)
.ThenBy(r => Convert.ToInt32(suffix.Match(r).Value));
foreach (var room in ordered2)
{
Console.WriteLine(room);
}
using System;
using System.Collections;
class Program
{
static void Main()
{
string[] highways = new string[]
{
"100F",
"50F",
"SR100",
"SR9"
};
//
// We want to sort a string[] array called highways in an
// alphanumeric way. Call the static Array.Sort method.
//
Array.Sort(highways, new AlphanumComparatorFast());
//
// Display the results
//
foreach (string h in highways)
{
Console.WriteLine(h);
}
}
}
var unordered = new[] { "CCC ROOM 10", "CCC ROOM 5", "AAA ROOM 1", "AAA ROOM 14", "AAA ROOM 2", "AAA ROOM 10", "AAA ROOM 5", "BBB ROOM 3", "BBB ROOM 12" };
var ordered = unordered.OrderBy(s => s, new AlphanumComparatorFast());
AAA ROOM 1
AAA ROOM 2
AAA ROOM 5
AAA ROOM 10
AAA ROOM 14
BBB ROOM 3
BBB ROOM 12
CCC ROOM 5
CCC ROOM 10