私はイベントのリストを持っており、それぞれには平日が登録されています。C#3.0 - 月曜日から週名でリストを注文するにはどうすればよいですか?
そして今私はこれらの出来事のすべてを表示しようとしていますが、平日の名前(月曜日、火曜日、水曜日...)で注文しています。
どうすればいいですか?私はLinqToSQLとラムダ式を使用しています。
ありがとうございます!
私はイベントのリストを持っており、それぞれには平日が登録されています。C#3.0 - 月曜日から週名でリストを注文するにはどうすればよいですか?
そして今私はこれらの出来事のすべてを表示しようとしていますが、平日の名前(月曜日、火曜日、水曜日...)で注文しています。
どうすればいいですか?私はLinqToSQLとラムダ式を使用しています。
ありがとうございます!
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);
}
}
rossfabricant、私はあなたが上で述べたようなことをしました。このリストを作成することによってうまく機能しました
あなたは曜日に対応する整数であるためにあなたのソートフィールドを望む:より詳細なしで
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)
明確化:「それらのそれぞれが登録平日を持っている」とは、どの曜日が表されていますか?日付オブジェクト?列挙?文字列?
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の「日付」が含まれていると仮定すると、
自分のIComparerは私が考えている最も良い方法です – abatishchev
彼はDateTimeを持っていない、彼はvarcharとしてDBに値を格納している – Joseph
平日のみ、日曜日と土曜日は重要ではありません。
これは私のために働いていた:originalCollection
はweekDayList
順序に従ってソートされますそれを
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
は、次のコードを使用してください。
DBにdatetime形式で保存されていますか? – Joseph
varcharとして、何らかの理由でweeknameが必要なので、 – AndreMiranda