排序列表<文本框>数字C#

时间:2016-06-27 13:24:35

标签: c# linq list sorting

我将这些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

7 个答案:

答案 0 :(得分:3)

您必须将其转换为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();
}

答案 1 :(得分:2)

您必须进行数字排序,而不是词典排序。试试这个:

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);

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

答案 2 :(得分:0)

您按字母顺序对它们进行排序,将您的return语句更改为:

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

为了使列表按数字排序

答案 3 :(得分:0)

你应该把它们比作数字,而不是字符串:

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

添加该位将您从{1}}中删除的名称从字符串转换为int。

答案 4 :(得分:0)

修改为

OrderByDescending(x =&gt; Convert.ToInt32(x.Name.Replace(“tb_class”,“”)))

答案 5 :(得分:0)

  

我将这些TextBox标记为“tb_class#”和#= 1-10

通过这种编码,您可以利用更多数字的数字更大的事实,以及LINQ排序稳定。换句话说,只需先按文字长度排序,然后按文字排序:

@ManyToOne
@JoinTable(name="desired_table_name", joinColumns={@JoinColumn(name="person_id", referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")})
private Company company;

答案 6 :(得分:-2)

这可能有效:

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();
}