窗体c#排序房间列表,这是一个字符串

本文关键字:字符串 一个 排序 房间 列表 窗体 | 更新日期: 2023-09-27 18:15:31

我从一个开发人员那里接手了一个项目。

我们有一个窗口窗体,我们使用它来发送一个字符串,用户可以访问openfire聊天室。

有些房间被命名为"AAA 1室"answers"AAA 2室"等。如果我使用这个代码,它会按"AAA ROOM 1"AAA ROOM 11"排序,然后在"AAA ROOM 19"之后是"AAA ROOM 2"

RoomList.BeginUpdate();
foreach (Room r in Rooms) // original room list before getting it sorted
{
    RoomList.Items.Add(r.Name, IsMember(r.ID));
}
RoomList.EndUpdate();

所以我想按正确的顺序排序(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));
}

但是当我保存数据时,它使用这里的代码,但它没有标记正确的房间。这是它用来保存会员资格的代码(如果我勾选添加"AAA Room 11",那么它实际上将其保存为"AAA Room 18")。

MasterRecord.User.Memberships = "";
foreach (object o in RoomList.CheckedIndices)
{
    if (MasterRecord.User.Memberships.Length > 0)
        MasterRecord.User.Memberships += ",";
    MasterRecord.User.Memberships += GetItem(roomsui.StrToInt(o.ToString())).ToString();
}         

请理解我对这个开发有点陌生,所以我需要一些帮助,如何在检索它和保存它时正确地排序。

另外,我希望能够有一个弹出窗口,如果用户把检查到某些房间

窗体c#排序房间列表,这是一个字符串

在我看来,将此视为决定哪个房间首先排序的长度问题是错误的。如果房间名称的模式是{ROOM-NAME}_{ROOM_NUMBER},那么就这样对待它。(尽管我很讨厌这么说,有时候:这可能是正则表达式的工作!)

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" };
Regex pattern = new Regex(@"^('D+)('d+)$");
var ordered = unordered
    .Select(
        r =>
        {
            Match match = pattern.Match(r);
            return new
            {
                Name = r,
                Prefix = match.Groups[1].Value,
                Number = Convert.ToInt32(match.Groups[2].Value)
            };
        }
    )
    .OrderBy(r => r.Prefix)
    .ThenBy(r => r.Number);
foreach (var room in ordered)
{
    Console.WriteLine(room.Name);
}

该代码产生如下输出…

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

使用这个方法,我们称玫瑰为玫瑰(或者,具体地说,称数字的字符串表示为数字)。我使用匿名类型,这样我就不必运行两次匹配。

EDIT:我注意到你说的是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+$ =找一组紧接在字符串末尾的一个或多个数字

EDIT2:我想我没有回答你的第二个问题。根据如何从房间列表初始化表单,如何存储复选框,如何处理它,以及存在哪些其他数据结构来保存其余信息等,答案可能会有所不同。

首先,让我们稍微重构一下代码,因为它很难阅读:

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。列表中,你可以用同样的方法:

 foreach (var r in sortedRooms) {
      RoomList.Items.Add(r.Name, IsMember(r.ID));
 }

希望对大家有所帮助

我认为你需要一个字母数字排序(也可以用于其他排序与数字)。

试试这个快速解决方案:

c#字母数字排序http://www.dotnetperls.com/alphanumeric-sorting

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

这里有一篇关于这个问题的好文章:

人类的排序:自然排序顺序http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html