我有一个包含两个属性(名称和位置)的项目数组。数组没有以任何方式排序,我想按位置顺序填充列表框。
我可以使用下面的代码执行此操作,首先我添加所有项目,以便我有一个包含正确数量的项目的列表,然后将项目替换为正确的位置。但我想知道是否有更好的方法来做到这一点?
我希望列表框按以下顺序排列:Mark,John和James。
注意:詹姆斯,马克和约翰的数据只是一个例子,我不能对常设阵列进行排序。
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);
}
答案 0 :(得分:1)
您可以使用数组的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#。标准是Classes和Properties为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());
答案 1 :(得分:0)
如果我是你,我会首先创建一个_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内置排序算法排序了List,您可以将其添加到控件Items集合中。您可以使用AddRange方法节省时间:
listBox1.Items.AddRange(sorted);
参考资料来源: