窗口窗体c#对房间列表进行排序,该列表为字符串

窗口窗体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

我从我们的一个开发者那里接管了一个项目

我们有一个窗口表单,用于发送一个字符串,用户可以访问该字符串的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.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