如何排序BindingList <T>?

Ale*_*der 5 c# winforms

我在中存储了数千个MyClass对象BindingList<MyClass>。我想按日期属性对它们进行排序MyClass.dt

BindingList类不支持直接排序。如何BindingList<T>不对所有对象进行重复复制?我需要按升序或降序对它们进行排序。

我不需要BindingList.Sort()中SortableBindingList描述的特殊类来表现像List.Sort()。我正在寻找一两行代码的简短解决方案。

Igo*_*gor 5

Linq会工作。

var sortedListInstance = new BindingList<MyClass>(unsortedListInstance.OrderBy(x => x.dt).ToList());
Run Code Online (Sandbox Code Playgroud)

请记住,您会获得排序列表的浅表副本,而不是的重复实例MyClass

不要忘记在代码文件的顶部包含名称空间 System.Linq

  • 请注意,这是您首次创建列表时的绝佳解决方案。以后插入项目时,您可能要确保只在正确的索引处[插入](https://msdn.microsoft.com/en-us/library/ms132696(v = vs.110).aspx)首先。 (2认同)

TnT*_*nMn 5

在 BindingList 上实现 Sort 的一种快速方法是使用将支持 IList< T >作为其参数的构造函数。您可以使用 aList<T>作为支持并获得其Sort功能。

根据文档

使用此 BindingList 创建一个由列表支持的 BindingList,以确保对列表的更改反映在 BindingList 中。

如果您的 MyClass 被定义为:

internal class MyClass
{
    public MyClass(string name, Int32 num)
    {
        this.Name = name;
        this.Num = num;
    }
    public string Name {get; set;}
    public Int32 Num {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

那么你可以做这样的事情来在Num现场对其进行排序。

private List<MyClass> backing;
private BindingList<MyClass> bl;

    private void InitializeBindingList()
        {
            backing = new List<MyClass>();
            bl = new BindingList<MyClass>(backing);
            bl.Add(new MyClass("a", 32));
            bl.Add(new MyClass("b", 23));
            bl.Add(new MyClass("c", 11));
            bl.Add(new MyClass("d", 34));
            bl.Add(new MyClass("e", 53));
        }

    private void SortBindingList()
        {
            backing.Sort((MyClass X, MyClass Y) => X.Num.CompareTo(Y.Num));
            // tell the bindinglist to raise a list change event so that 
            // bound controls reflect the new item order
            bl.ResetBindings();
        }
    }
Run Code Online (Sandbox Code Playgroud)

您需要在对后备列表进行排序后调用BindingList.ResetBindings方法以通知任何绑定控件BindingList已更改并更新控件。