将 ListBox 中的项目作为 Int 排序列表

Sorting list with items from ListBox as Int

解释此 WindowsFormAplication: 我有两个按钮,一个用于在带有文本框的 listbox1 中插入数字,效果很好,第二个按钮用于 sorting listbox1(numbers) 中的元素作为 intarraylistbox2。它需要是 intarray 因为如果我将它排序为 string 那么如果我有例如 3,2,10 作为列表框中的元素它会将其排序为 10,2,3 因为它的字符串, 现在我的排序按钮中有这段代码,我从列表框元素制作 list 并将其排序为字符串,但不知道如何将列表转换为数组或整数:

private void button2_Click(object sender, EventArgs e)
    {
        List<String> lista = new List<string>();

        foreach (String x in listBox1.Items)
        {
            lista.Add(x);
        }
        lista.Sort();
        foreach (string a in lista)
        {
            listBox2.Items.Add(a);
        }
    }

我自己找到了解决方案,所以这是代码:

private void button2_Click(object sender, EventArgs e)
    {
        List<int> lista = new List<int>();

        foreach (string x in listBox1.Items)
        {
            lista.Add(Convert.ToInt32(x));
        }
        lista.Sort();
        foreach (int a in lista)
        {
            listBox2.Items.Add(a);
        }
    }

我希望有人觉得这有帮助。

A ListBox 接受任何类型的元素,而不仅仅是字符串。所以,你可以直接添加ints。无需转换为字符串。然后您可以再次检索整数。

但是,我会将值存储在列表中,而不是列表框的项目集合中。

private List<int> numbers = new List<int>();

private void btnAdd_Click(object sender, EventArgs e)
{
    if(Int32.TryParse(TextBox1.Text, out int n)) {
        numbers.Add(n);
        listBox1.DataSource = null;
        listBox1.DataSource = numbers;
    } else {
        MsgBox.Show("You must enter an integer!");
    }
}

private void btnSort_Click(object sender, EventArgs e)
{
    numbers.Sort();
    listBox1.DataSource = null;
    listBox1.DataSource = numbers;
}

设置列表框的 DataSource 不会将项目插入列表框,而是告诉列表框显示您的集合中的元素,而不是它自己的内部集合。

如果您将同一个列表赋值两次,列表框将不会注意到列表的内容发生了变化。因此,先赋值null

您可以将比较委托传递给 lista.Sort() 方法,该方法会将项目转换为整数并按其数值对它们进行排序。像这样:

lista.Sort((a, b) =>
{
    return Convert.ToInt32(a).CompareTo(Convert.ToInt32(b));
});

请注意,这不会检查转换是否有效或类似内容。