在WPF中按月份名称对ObservableCollection值进行排序

时间:2018-01-09 21:43:39

标签: wpf observablecollection icomparer

我使用WPF并且我有一个-(NSDecimalNumber *)getRoundedNumberAfterPointDigitsCount:(int)digitsCount withDouble:(double)doubleValue{ NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",doubleValue]]; NSDecimalNumberHandler *decimalHandler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain scale:digitsCount raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]; decimalNumber = [decimalNumber decimalNumberByRoundingAccordingToBehavior:decimalHandler]; return decimalNumber; } ,myObj类是:

DECLARE @AcademicYear varchar(9) = '2017/2018',
        @Collection varchar(50) = 'Autumn';


SELECT

Test = NULLIF(COUNT(g1.Points),0),

 cast(s.Year as int) as Year,

CASE r.Subject
    WHEN 'English' THEN 1
    WHEN 'English Language' THEN 2
    WHEN 'English Literature' THEN 3
    WHEN 'Maths' THEN 4
    WHEN 'Science' THEN 5
    WHEN 'Additional Science' THEN 6
    WHEN 'Biology' THEN 7
    WHEN 'Chemistry' THEN 8
    WHEN 'Physics' THEN 9
    WHEN 'Arabic' THEN 10
    WHEN 'Dutch' THEN 11
    WHEN 'French' THEN 12
    WHEN 'Russian' THEN 13
    WHEN 'Spanish' THEN 14
    WHEN 'Urdu' THEN 15
    ELSE 16
  END AS SubjectSort,

 r.Subject, r.Class, 
  0 AS GroupSort,
'SEND (' + CAST(COUNT(g1.Points) AS varchar) + ')' AS 'Group',


    --Other
 SUM(CASE
    WHEN r.Progress in ('X','Abs','New') THEN 1
    ELSE 0
  END) AS 'No. Other'

FROM Results r
 JOIN Grades g1
  ON r.Result = g1.Grade
LEFT JOIN students s
  ON r.UPN = s.UPN

WHERE r.AcademicYear = @AcademicYear
AND s.AcademicYear = @AcademicYear
AND r.Collection = @Collection
AND SEND = 'Y'

GROUP BY s.Year,
         r.Subject, r.Class

Order by cast(s.year as int) desc, SubjectSort, r.Subject, r.Class, GroupSort

happenndAtMonth 是月份的名称。我的observableCollection( MyObColl )将具有以下值:

Observablecollection<MyObj>

我需要按月对MyObColl进行排序输出应该是:

MyObject
{
string happenAtMonth;
int value;
}

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

3 个答案:

答案 0 :(得分:3)

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

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 );

答案 1 :(得分: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 :(得分:0)

尝试一下:

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