C # 3.0 - Как я могу заказать список по названию недели, начиная с понедельника? - PullRequest
1 голос
/ 07 апреля 2009

У меня есть список событий, и у каждого из них зарегистрирован день недели.

А сейчас я пытаюсь показать все эти события, но упорядочено по названию дня недели (понедельник, вторник, среда ...).

Как я могу это сделать? Я использую LinqToSQL и лямбда-выражения.

Спасибо !!

Ответы [ 7 ]

4 голосов
/ 07 апреля 2009
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);
  }
}
2 голосов
/ 07 апреля 2009

Я знаю, что можно отсортировать список с помощью пользовательского класса, который реализует 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 #.

1 голос
/ 17 февраля 2015

Используйте следующий код:

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

При этом originalCollection будет отсортировано в соответствии с порядком weekDayList.

1 голос
/ 07 апреля 2009

Предполагая, что ваш объект Event содержит дату DateTime, вы можете просто отсортировать по перечислению DateTime.DayOfWeek, например, так:

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

Это будет сортировать события воскресенье-суббота, и, поскольку вы работаете только по будням, воскресенье и суббота не должны иметь значения.

1 голос
/ 07 апреля 2009

Вы бы хотели, чтобы вашим полем сортировки было целое число, соответствующее дню недели:

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 голосов
/ 01 июля 2011

это сработало для меня:

from e in events
orderby e.dateFildName.Value.DayOfWeek
0 голосов
/ 07 апреля 2009

Разъяснение: как каждый день имеет зарегистрированный день недели, как обозначается день недели? Дата Объект? Enum? Строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...