2009-04-07 13 views
1

私はイベントのリストを持っており、それぞれには平日が登録されています。C#3.0 - 月曜日から週名でリストを注文するにはどうすればよいですか?

そして今私はこれらの出来事のすべてを表示しようとしていますが、平日の名前(月曜日、火曜日、水曜日...)で注文しています。

どうすればいいですか?私はLinqToSQLとラムダ式を使用しています。

ありがとうございます!

+0

DBにdatetime形式で保存されていますか? – Joseph

+0

varcharとして、何らかの理由でweeknameが必要なので、 – AndreMiranda

答えて

4
public class Event 
{ 
    public string Day; 
} 

[Test] 
public void Te() 
{ 
    var dayIndex = new List<string> {"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"}; 
    var list = new List<Event> {new Event(){Day = "saturday"}, new Event() {Day = "Monday"}, new Event() {Day = "Tuesday"}}; 
    var sorted = list.OrderBy(e => dayIndex.IndexOf(e.Day.ToUpper())); 
    foreach (var e in sorted) 
    { 
    Console.WriteLine(e.Day); 
    } 
} 
+0

rossfabricant、私はあなたが上で述べたようなことをしました。このリストを作成することによってうまく機能しました平日の名前! ありがとう! – AndreMiranda

1

あなたは曜日に対応する整数であるためにあなたのソートフィールドを望む:より詳細なしで

1 = Monday 
2 = Tuesday 
3 = Wednesday 
... 

、あなたのコードサンプルを与えることは困難です。曜日がvarcharとして保存されている場合は、曜日を文字列引数にとり、適切な整数を返すデータベーススカラー関数を作成することをお勧めします。ここで

は、T-SQLのサンプルです:

create function dbo.GetDayNumber (
    @dayOfWeek varchar(9) 
) returns tinyint 
as begin 

declare @dayNum tinyint 
set @dayNum = 0 

select @dayNum = 
    case 
     when @dayOfWeek = 'Monday' then 1 
     when @dayOfWeek = 'Tuesday' then 2 
     when @dayOfWeek = 'Wednesday' then 3 
     when @dayOfWeek = 'Thursday' then 4 
     when @dayOfWeek = 'Friday' then 5 
     when @dayOfWeek = 'Saturday' then 6 
     when @dayOfWeek = 'Sunday' then 7 
    end 

return @dayNum 

end 

は注意してください - 上記のコードは、データが完全でない場合は、あなたの結果とさせる可能性がある無効な曜日名、0を返します。

select 
    MyEvent, 
    DayOfWeek 
from MyEventTable 
order by dbo.GetDayNumber(DayOfWeek) 
0

明確化:「それらのそれぞれが登録平日を持っている」とは、どの曜日が表されていますか?日付オブジェクト?列挙?文字列?

2

IComparer(Of DateTime)を実装するカスタムクラスを使用してリストをソートすることは可能です。ですから、このようなクラスを作成したい:

Public Class WeekDayComparer 
    Implements IComparer(Of MyEvent) 

    Public Function Compare(ByVal x As MyEvent, ByVal y As MyEvent) As Integer Implements System.Collections.Generic.IComparer(Of MyEvent).Compare 

    Return GetDayOfWeekNumber(x.DayOfWeek).CompareTo(GetDayOfWeekNumber(y.DayOfWeek)) 

    End Function 

    Private Function GetDayOfWeekNumber(ByVal dayOfWeek As String) As Integer 

    Select Case dayOfWeek.ToLower() 
     Case "monday" 
     Return 0 
     Case "tuesday" 
     Return 1 
     Case "wednesday" 
     Return 2 
     Case "thursday" 
     Return 3 
     Case "friday" 
     Return 4 
     Case "saturday" 
     Return 5 
     Case "sunday" 
     Return 6 
     Case Else 
     Return 7 
    End Select 

    End Function 

End Class 

次に使用すると、オブジェクトのリストを取り、あなたのWeekDayComparerクラスを使用してそれらを並べ替えると思います。

events.Sort(New WeekDayComparer()) 

これはVBですが、簡単にC#に変換されます。日曜日〜土曜日のイベントを並べ替え、そしてあなた以降」よ

List<Event> events = new List<Event>(); // filled elsewhere 
events.Sort((x,y) => x.Date.DayOfWeek.CompareTo(y.Date.DayOfWeek)); 

:あなたのEventオブジェクトがそうのように、あなただけのソートDateTime.DayOfWeek列挙によってできる、DateTimeの「日付」が含まれていると仮定すると、

+0

自分のIComparerは私が考えている最も良い方法です – abatishchev

+0

彼はDateTimeを持っていない、彼はvarcharとしてDBに値を格納している – Joseph

1

平日のみ、日曜日と土曜日は重要ではありません。

0

これは私のために働いていた:originalCollectionweekDayList順序に従ってソートされますそれを

var originalCollection = new List<string>{ "Wednesday","Friday" "Thursday", "Sunday", "Monday","Saturday","Tuesday"};   
var weekDayList = new List<string>{ "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday", "Sunday"}; 
var sortedWeekDays = originalCollection (i => weekDayList.IndexOf(i.ToString())); 

from e in events 
orderby e.dateFildName.Value.DayOfWeek 
1

は、次のコードを使用してください。

関連する問題