2013-09-03 27 views
12

Tôi đang sắp xếp một số đối tượng theo thuộc tính System.DayOfWeek của chúng..OrderBy (DayOfWeek) để xử lý Chủ Nhật vào cuối tuần

DayOfWeek xử lý chủ nhật như bắt đầu trong tuần, trong khi tôi muốn nó được ra lệnh để nó xuất hiện tại cuối. Nó chỉ là một enum, vì vậy tôi không thể sửa đổi nó. Tuy nhiên tôi đã đọc rằng tôi có thể tạo ra một custom culture nhưng nghĩ rằng đây có lẽ là quá mức cần thiết.

List<TimeBand> orderedTimeBands = timeBands.OrderBy(x => x.DayName).ToList()

Vì vậy DayName là một DayOfWeek, tôi muốn orderedTimeBands được đặt hàng từ Thứ Hai -> Chủ Nhật.

Bất kỳ ý tưởng nào?

+0

@TimSchmelter - Xin lỗi nếu tôi không rõ ràng, đó là 'System.DayOfWeek' –

Trả lời

28

Phương pháp đơn giản nhất sẽ là:

var orderedTimeBands = timeBands.OrderBy(x => ((int) x.DayOfWeek + 6) % 7) 
           .ToList() 

Vì vậy, chúng ta có:

Name  Original value  Value after arithmetic 
Sunday  0     6 
Monday  1     0 
Tuesday  2     1 
Wednesday 3     2 
Thursday  4     3 
Friday  5     4 
Saturday  6     5 

... đó là những gì bạn muốn, tôi nghĩ vậy.

+0

mục này (+1) hoặc như được chỉ ra trong http://stackoverflow.com/questions/3135587/c-set-initial- dayofweek-as-monday-không-chủ nhật bạn có thể viết một "CustomCulture" tùy chỉnh và chỉ cần nói rằng thứ hai của nó – Najzero

+0

@Najzero: Vâng, OP đã đề cập ý tưởng văn hóa tùy chỉnh trong câu hỏi. Tôi chắc chắn sẽ coi đó là quá mức cần thiết. –

+0

Ví dụ tuyệt vời của suy nghĩ ra khỏi hộp, vui mừng bạn đồng ý với tôi rằng một nền văn hóa tùy chỉnh là quá mức cần thiết. Dường như làm việc, tôi sẽ chỉ đảm bảo rằng tôi đặt nó vào một phương pháp mô tả lý do tại sao chúng tôi đang sử dụng bổ sung và mô đun để tiết kiệm sự nhầm lẫn trong tương lai. –

2

tôi sử dụng một giải pháp dựa trên nền văn hóa hiện nay:

// all days of week 
var daysOfWeek = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>(); 

// get first day of week from current culture 
var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 

// all days of week ordered from first day of week 
var daysOfWeekOrdered = daysOfWeek.OrderBy(x => (x - firstDayOfWeek + 7) % 7); 

Phần quan trọng là OrderBy lambda. Về cơ bản, phiên bản này là được tham số Jon's answer ở trên.

Bằng cách này, nó sẽ được đặt hàng từ thứ Hai ở Vương quốc Anh và từ Chủ Nhật tại Hoa Kỳ.

Các vấn đề liên quan