<TextBox> 按数字方式对列表进行排序 C#



我把这些TextBoxes标记为tb_class## = 1-10

到目前为止,这是我的函数

    private List<TextBox> GetCustomClasses()
    {
        List<TextBox> tb = new List<TextBox>();
        foreach (Control con in gb_customClasses.Controls)
            if (con.Name.Contains("tb_class"))
                tb.Add(con as TextBox);
        return tb.OrderByDescending(x => x.Name.Replace("tb_class", "")).ToList();
    }

输出如下所示:

9
8
7
6
5
4
3
2
10
1

我可以为这个添加一个检查,但我希望它完全有序。对于那些想知道gb_customClassesgroupbox的人。

解决!最后的代码:

    private List<TextBox> GetCustomClasses()
    {
        List<TextBox> tb = new List<TextBox>();
        foreach (Control con in gb_customClasses.Controls)
            if (con.Name.Contains("tb_class"))
                tb.Add(con as TextBox);
        return tb.OrderByDescending(x => int.Parse(x.Name.Replace("tb_class", ""))).ToList();
    }

我甚至没有想过要添加int.Parse

您必须将其转换为int,这是一个仅LINQ的方法:

private List<TextBox> GetCustomClasses()
{
    return gb_customClasses.Controls.OfType<TextBox>()
        .Where(txt => txt.Name.StartsWith("tb_class"))
        .OrderByDescending(txt => int.Parse(txt.Name.Substring("tb_class".Length)))
        .ToList();
}

必须按数字排序,而不是按字典排序。试试这个:

return tb.OrderByDescending(x => int.Parse(x.Name.Replace("tb_class", ""))).ToList();

注意,您可能不必调用.ToList(),这取决于您的情况。返回一个IEnumerable<TextBox>可能会有用——所以一定要检查一下。


不要害怕使用Tag属性在控件上存储一些额外的信息!这个解决方案稍微好一些:

return tb.OrderByDescending(x => (int)x.Tag);

return tb.OrderByDescending(x => ((MyClass)x.Tag).Index);

您只需要确保为添加到gb_customClasses.Controls的任何TextBox添加适当的Tag。如果控件是动态创建的,我会倾向于这种方法(这样标记很容易,命名甚至不是必须的)

按字母顺序排序,将返回语句更改为:

return tb.OrderByDescending(x => Int32.Parse(x.Name.Replace("tb_class", ""))).ToList();

为了获得按数字排序的列表

您应该将它们作为数字进行比较,而不是字符串:

return tb.OrderByDescending(x => Convert.ToInt32(x.Name.Replace("tb_class", ""))).ToList();

添加这一小部分将您从字符串中删除tb_class的名称转换为int。

修改为

orderbydescent (x => Convert.ToInt32(x. name;替换("tb_class ", ")))

我将这些文本框标记为"tb_class#"和# = 1-10

使用这样的编码,您可以利用这样一个事实,即位数越多的数字越大,而且LINQ排序稳定。换句话说,简单地先按文本长度排序,然后按文本排序:

return tb.OrderByDescending(x => x.Name.Length).ThenByDescending(x => x.Name).ToList();

这可能行得通:

private List<TextBox> GetCustomClasses()
{
    List<TextBox> tb = new List<TextBox>();
    List<String> indexes = new List<string>();
    //  N.B. A more conservative implementation might want to go for an unsigned 
    //  64-bit thing here. Just in case you run into a really big GroupBox.
    //  
    //  **WARNING** Due to Brexit, UK compilers will be changing to base 12, which 
    //  may adversely affect the performance of this loop. Also keep an eye out for 
    //  unpredictable fluctuations in the exchange rate with UK integers. 
    for (String i = "0"; Int32.Parse(i) < 0x7fffffff; i = (Int32.Parse(i) + 1).ToString())
    {
        indexes = indexes.Union(new string[] { i }).ToList();
    }
    var arrayOfIndexes = indexes.ToArray();
    //  Leave room for null terminator
    var reordered = new TextBox[gb_customClasses.Controls.Count + 1];
    foreach (Control con in gb_customClasses.Controls)
        if (con.Name.Contains("tb_class"))
            reordered[arrayOfIndexes.ToList().IndexOf(con.Name.Replace("tb_class", ""))] = con as TextBox;
    return reordered.ToList();
}

相关内容

  • 没有找到相关文章

最新更新