相对于另一个列表框对列表框进行排序

本文关键字:列表 排序 相对于 另一个 | 更新日期: 2023-09-27 18:21:38

我知道您可以设置一个ListBox来自动排序。有没有一种方法可以"捕捉"排序,这样当ListBox交换两个项目的位置时,我就可以在另一个列表框上进行同样的重新排序?我想按值对一个列表框进行排序,但与其他地方的另一个ListBox相比,这些值保持在相同的相对索引位置。

我可以写一个例程来对列表进行冒泡排序,这样我就可以自己进行更改,但我想知道是否有一个更自动化的程序,因为我可能不得不在程序中的几个不同地方这样做。

相对于另一个列表框对列表框进行排序

不幸的是,Sorted属性不使用IComparable接口实现,只是根据项的ToString结果进行排序。但是,您可以使用排序的数据源(例如List<>),而不是设置Sorted属性。

ListBox中的项创建一个包装类,并在其上实现IComparable<T>接口。用这些ListBoxItem实例填充List<>,然后调用列表上的Sort方法。因此,您将能够调度CompareTo调用。

public partial class Form1 : Form
{
    private class ListBoxItem<T> : IComparable<ListBoxItem<T>>
        where T : IComparable<T>
    {
        private T item;
        internal ListBoxItem(T item)
        {
            this.item = item;
        }
        // this makes possible to cast a string to a ListBoxItem<string>, for example
        public static implicit operator ListBoxItem<T>(T item)
        {
            return new ListBoxItem<T>(item);
        }
        public override string ToString()
        {
            return item.ToString();
        }
        public int CompareTo(ListBoxItem<T> other)
        {                
            return item.CompareTo(other.item); // here you can catch the comparison
        }
    }
    public Form1()
    {
        InitializeComponent();
        var items = new List<ListBoxItem<string>> { "Banana", "Apple"};
        items.Sort();
        listBox1.DataSource = items;
    }