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

本文关键字:排序 数组排序 列表 何填充 填充 | 更新日期: 2023-09-27 18:37:02

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

可以使用下面的代码来做到这一点,首先我添加所有项目,以便我有一个包含正确数量项目的列表,然后在正确的位置替换项目。但我想知道是否有更好的方法可以做到这一点?

我希望列表框的名称按此顺序排列:马克、约翰和詹姆斯。

注意:詹姆斯、马克和约翰的数据只是一个示例,我无法对站立数组进行排序。

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

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

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

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

您也可以按顺序排序:

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

这两者都需要参考System.Linq

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

_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 类上的 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;
    }
}

最后,我必须提到,您的大小写/命名约定不是标准的 C#。标准是类和属性为 PascalCase,参数为 camelCase,私有字段为 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());
如果我

是你,我会先创建一个_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 内置排序算法的排序列表,你可以将其添加到控件 Items 集合中。可以使用 AddRange 方法节省时间:

listBox1.Items.AddRange(sorted);

参考资料来源:

  • 对集合进行排序
  • 添加范围