【问题标题】:How to sort ObservableCollection alphabetically? [duplicate]如何按字母顺序对 ObservableCollection 进行排序? [复制]
【发布时间】:2017-01-17 16:12:25
【问题描述】:

我需要在填充后按字母顺序对ObservableCollection 进行排序,假设里面有这个模型:

class Nation
{
    public string Name { get; set; }
}

这是我的ObservableCollection

ObservableCollection<Nation> ob = new ObservableCollection<Nation>();

假设里面有三件按这个顺序排列的物品:

  1. 英格兰
  2. 阿富汗
  3. 意大利

我需要按字母顺序排序,所以我尝试:

ob.OrderBy(c => c.Name);

但我没有效果,什么时候应该是:

  1. 阿富汗
  2. 英格兰
  3. 意大利

我做错了什么?

【问题讨论】:

  • 您必须将结果分配给某些东西,它会返回一个排序的集合。 var sortedOb = ob.OrderBy(c =&gt; c.Name);
  • @Igor 所以应该是:ob = ob.OrderBy(c =&gt; c.Name);?
  • 您必须将其转换回ObservableCollection&lt;T&gt;,因为OrderBy 返回IEnumerable&lt;T&gt;
  • @AgainMe 每个 LINQ 方法都会生成一个新的枚举,而不是修改原来的枚举
  • @AgainMe 否 - 它返回一个 iterator 包装原始集合,当您循环遍历它时以指定的顺序返回它们的元素

标签: c# sorting


【解决方案1】:

ObservableCollection 绑定到CollectionViewsource,添加排序 就可以了,然后使用CollectionViewSource作为ItemSource 控制。

使用 CollectionViewSource 进行排序

<CollectionViewSource x:Key='src' Source="{Binding ob}">
        <CollectionViewSource.SortDescriptions>
            <componentModel:SortDescription PropertyName="Name" />
        </CollectionViewSource.SortDescriptions>
 </CollectionViewSource>

示例用法

<ListView ItemsSource="{Binding Source={StaticResource src}}" >

【讨论】:

  • 最佳解决方案,谢谢。
【解决方案2】:
var ob = new ObservableCollection<Nation>
{
    new Nation {Name = "Sweden"},
    new Nation {Name = "Afghanistan"},
    new Nation {Name = "England"},
    new Nation {Name = "Albania"},
};

var sorted = ob.OrderBy(n => n.Name);

sortedIEnumerable 并已排序,如果您仍然需要它为 ObservableCollection,只需将其传递给构造函数,如 here 所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2016-03-11
    • 1970-01-01
    • 2015-04-27
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多