【问题标题】:Sort ObservableCollection values by month name in WPF在 WPF 中按月份名称对 ObservableCollection 值进行排序
【发布时间】:2018-06-19 00:18:56
【问题描述】:

我使用 WPF,我有一个 Observablecollection<MyObj>,myObj 类是:

MyObject
{
string happenAtMonth;
int value;
}

happendAtMonth 是月份的名称。我的 observableCollection (MyObColl) 将具有以下值,例如:

MyObColl.Add(new MyObj("October", 3));
MyObColl.Add(new MyObj("January", 450));
MyObColl.Add(new MyObj("June", 15));
MyObColl.Add(new MyObj("Febraury", 125));

我需要按月排序这个 MyObColl 输出应该是这样的:

Value was 450 in January
Value was 125 in Febraury
Value was 15 in June
Value was 3 in October

我将如何实现这一点并按月份名称使用 ObservableCollection 进行排序? 谢谢

【问题讨论】:

  • 您想对集合进行排序,以便绑定到它的任何内容都能看到排序后的序列吗?在这种情况下,到目前为止提供的所有答案都不能回答您的问题。他们只是创建了一个已排序的IEnumerable<MyObject>,而原始的ObservableCollection 没有更改。相反,您应该查看How do I sort an observable collection?,然后这个问题是重复的。

标签: wpf observablecollection icomparer


【解决方案1】:

您需要提供月份字符串与其索引之间的连接。例如:

var months = new Dictionary<string, int>()
{
  {"January", 0},
  {"February", 1}
  //...
};
MyObjColl.OrderBy(x => months[x.happenAtMonth]);

或者更好的方法可能是定义一个枚举:

public enum Month
{
  January = 1,
  February = 2,
  //...
}

并将对象的定义更改为:

public class MyObject
{
  public Month HappenAtMonth { get; set; }
  public int Value { get; set; }
}

然后:

MyObjColl.OrderBy(x => x.HappenAtMonth);

【讨论】:

    【解决方案2】:

    这会将字符串格式的月份解析为整数值并对其进行排序:

    var values = MyObColl.OrderBy( o => DateTime.ParseExact( o.Month , "MMMM" , CultureInfo.InvariantCulture ).Month )
        .Select( o => $"Value was {o.Value} in {o.Month}" );
    
    foreach ( var value in values )
        Console.WriteLine( value );
    

    【讨论】:

    • 很好的解决方案,但它给了我这样的输出(六月,十月,一月,二月)
    【解决方案3】:

    试试这个:

    MyObjColl= new ObservableCollection<DataConcept>(MyObjColl.OrderBy(i => i.HappenAtMonth));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2019-03-09
      相关资源
      最近更新 更多