如何填充用未排序的数组排序的列表框

How to populate a listbox sorted with unsorted array

我有一个包含两个属性的项目数组,名称和位置。该数组未以任何方式排序,我想按位置顺序填充列表框。

我可以用下面的这段代码来完成,首先我添加所有项目,这样我就有了一个包含正确数量项目的列表,然后将项目替换到正确的位置。但是不知道有没有更好的方法呢?

我希望列表框的名字顺序如下:Mark、John 和 James。

注意:James, Mark, John 数据只是一个例子,我无法对常设数组进行排序。

public class _standing
{
   public _standing(string _name, int _pos) {
      name = _name;
      position = _pos;
   }
   public string name { get; set; }
   public int position { get; set; }
}

_standing a = new _standing("James", 2);
_standing b = new _standing("Mark", 0);
_standing c = new _standing("John", 1);
_standing[] standing = new _standing[]{a, b, c};

for (int i = 0; i < standing.Length; i++) {
   listBox1.Items.Add(standing[i].name);
}
for (int i = 0; i < standing.Length; i++) {
   listBox1.Items.RemoveAt(standing[i].position);
   listBox1.Items.Insert(standing[i].position, standing[i].name);
}

如果我是你,我会先创建一个 _standing 列表并添加到列表中。类似于:

List<_standing> standingList = new List<_standing>();
standingList.Add(new _standing("James", 2)); 
etc...

使用 List 而不是数组类型的优点是它的大小是动态的。如果您只打算拥有 3 个 _standing 对象,那么数组就可以了,但实际上情况不太可能如此。

然后您可以使用 Linq 查询按位置对列表进行排序

IEnumerable<_standing> sorted = standingList.OrderBy(stand => stand.Position);

您现在有一个使用 .NET 内置排序算法的排序列表,您可以将其添加到您的控件项集合中。您可以使用 AddRange 方法节省时间:

listBox1.Items.AddRange(sorted);

参考来源:

你可以只使用数组的OrderBy方法:

standing = standing.OrderBy(i => i.position).ToArray();
listBox1.Items.AddRange(standing);

您也可以按降序排列:

standing.OrderByDescending(i => i.position).ToArray();

这些都需要参考 System.Linq

此外,由于 OrderBy returns 一个新对象,您也可以在不重新排序原始列表的情况下执行此操作:

_standing a = new _standing("James", 2);
_standing b = new _standing("Mark", 0);
_standing c = new _standing("John", 1);
_standing[] standing = new _standing[] { a, b, c };

listBox1.Items.AddRange(standing.OrderBy(i => i.position).ToArray());

更新

为了在 listBox1 中显示有意义的内容,您应该重写 _standing class 上的 ToString 方法,例如:

public class _standing
{
    public string name { get; set; }
    public int position { get; set; }

    public _standing(string _name, int _pos)
    {
        name = _name;
        position = _pos;
    }

    public override string ToString()
    {
        return position + ": " + name;
    }
}

最后,我不得不提一下,您的 casing/naming 约定不是标准的 C#。标准是 类 和属性为 PascalCase,参数为驼峰式,私有字段为带有可选下划线前缀的 pascalCase。因此,您的代码理想情况下应类似于:

public class Standing
{
    public string Name { get; set; }
    public int Position { get; set; }

    public Standing(string name, int position)
    {
        Name = name;
        Position = position;
    }

    public override string ToString()
    {
        return Position + ": " + Name;
    }
}

和...

Standing a = new Standing("James", 2);
Standing b = new Standing("Mark", 0);
Standing c = new Standing("John", 1);
Standing[] standing = { a, b, c };

listBox1.Items.AddRange(standing.OrderBy(i => i.Position).ToArray());