2017-06-17 129 views
-3

我有一種按照星期排序幾天的功能,因爲它們可能不是按順序排列的,但結果並不像預期的那樣工作。我究竟做錯了什麼?如何根據其日曆發生情況對星期幾進行排序

 public void SortRemainingDays() 
     { 
      var listOfTempDays = new List<string>(); 
      listOfTempDays.Add("Monday"); 
      listOfTempDays.Add("Tuesday"); 
      listOfTempDays.Add("Wednesday"); 
      listOfTempDays.Add("Thursday"); 
      listOfTempDays.Add("Friday"); 
      listOfTempDays.Add("Saturday"); 
      listOfTempDays.Add("Sunday"); 

      for (int i = 0; i < ListOfRemainingDays.Count; i++) 
      { 
       var day = ListOfRemainingDays[i]; 
       listOfTempDays.Remove(day); 
      } 

      ListOfRemainingDays = listOfTempDays; 

     } 
+1

'但它的結果沒有按預期工作'你可能想解釋你的期望。沒有它,你的問題是「不清楚」,並可能是downvoted和關閉 – psubsee2003

+0

你想排序天「星期一」,「星期二」...和你初始化ListOfRemainingDays –

+0

是的,@ psubsee2003你是儀式。 –

回答

0
void Main() 
{ 
    SortDaysOfWeek(new[] { 
     "Monday", 
     "Wednesday", 
     "Tuesday", 
     "Thursday", 
     "Sunday" 
    }).Dump(); 
} 

// Define other methods and classes here 

DayOfWeek GetDayOfWeekFromString(string str) 
{ 
    return (DayOfWeek)Enum.Parse(typeof(DayOfWeek), str); 
} 

int GetDayOfWeekPosition(DayOfWeek dow) 
{ 
    return (int)dow; 
} 

List<string> SortDaysOfWeek(IEnumerable<string> daysOfWeek) 
{ 
    return daysOfWeek 
     .Select(GetDayOfWeekFromString) 
     .GroupBy(x => GetDayOfWeekPosition(x), x => x) 
     .OrderBy(g => g.Key) 
     .SelectMany(x => x) 
     .Select(dow => dow.ToString()) 
     .ToList(); 
} 

上面的代碼爲LinqPad寫入(只是刪除Dump()呼叫)。

這假設你想按星期天排序作爲一週的第一天,這是相當標準的,如果你想讓星期一成爲第一天,我會把它留給你作爲練習來改變這一點。

此代碼生成:

1. Sunday 
2. Monday 
3. Tuesday 
4. Wednesday 
5. Thursday 

更新

我調整了代碼如下:

void Main() 
{ 
    SortDaysOfWeek(new[] { 
     "Monday", 
     "Wednesday", 
     "Tuesday", 
     "Thursday", 
     "Sunday" 
    }).Dump(); 
} 

// Define other methods and classes here 

DayOfWeek GetDayOfWeekFromString(string str) 
{ 
    return (DayOfWeek)Enum.Parse(typeof(DayOfWeek), str); 
} 

int GetDayOfWeekPosition(DayOfWeek dow) 
{ 
    return (int)dow; 
} 

List<string> SortDaysOfWeek(IEnumerable<string> daysOfWeek) 
{ 
    return daysOfWeek 
     .Select(GetDayOfWeekFromString) 
     .OrderBy(x => x, new DayOfWeekComparer(false)) 
     .Select(dow => dow.ToString()) 
     .ToList(); 
} 

class DayOfWeekComparer : IComparer<DayOfWeek> 
{ 
    private readonly bool _sundayStart = false; 
    public DayOfWeekComparer(bool sundayIsStartOfWeek) 
    { 
     _sundayStart = sundayIsStartOfWeek; 
    } 

    public int Compare(DayOfWeek left, DayOfWeek right) 
    { 
     var leftPos = (int)left; 
     var rightPos = (int)right; 

     if (!_sundayStart) 
     { 
      if (left == DayOfWeek.Monday) leftPos = 0; 
      if (left == DayOfWeek.Sunday) leftPos = 6; 
      if (right == DayOfWeek.Monday) rightPos = 0; 
      if (right == DayOfWeek.Sunday) rightPos = 6; 
     } 

     if (leftPos < rightPos) return -1; 
     if (leftPos > rightPos) return 1; 
     return 0; 
    } 
} 

我看到你基本上覆制了DayOfWeek枚舉並使用自己的定位,這當然不是這樣做的方式。

+0

在我接受這個答案之前,您是否可以調整代碼以便星期一是一週中的第一天? –

+0

@MikoM我已經把它留給你去做了,它不應該太難,而且在這裏是爲了激發解決問題的辦法,而不是一站式的複製和粘貼代碼。我已經向您展示了一般原則,現在取決於您,以適應您的需求。 – Clint

+0

哦,它只是創建GetDayOfWeekPosition函數? –

0

由@Clint提交的代碼工作,爲了使星期一成爲本週的第一天,我更改了DayOfWeek的枚舉值。

 [Serializable] 
     [ComVisible(true)] 
     public enum DayOfWeek 
     { 
      Monday = 0, 
      Tuesday = 1, 
      Wednesday = 2, 
      Thursday = 3, 
      Friday = 4, 
      Saturday = 5, 
      Sunday = 6 
     } 
+0

看到我更新的答案,這不是你應該這樣做的方式。 – Clint

相關問題