2017-06-17 15 views
-3

曜日を並べ替える機能はありますが、順番が違う可能性がありますが、結果が期待通りに機能しないためです。私は間違って何をしていますか?カレンダーオカレンスに従って曜日のリストを並べ替えるにはどうすればいいですか?

+1

「結果は期待どおりに機能していません。それがなければ、あなたの質問は「不明」で、下落して閉鎖される可能性があります。 – psubsee2003

+0

"Monday"、 "Tuesday" ...とListOfRemainingDaysを初期化した日を並べ替えたい –

+0

はい、@ psubsee2003あなたは儀式です。 –

答えて

0
 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; 

     } 
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 

アップデートを

私は、次のコードを微調整しました:私はあなたが基本的にDayOfWeekを複製したいことを見

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; 
    } 
} 

列挙し、あなた自身の位置を使用して、これは確かにこれを行う方法ではありません。

+0

私はこれを答えとして受け入れる前に、月曜日が週の最初の曜日であるようにコードを調整できますか? –

+0

@MikoM私はそれを残しました。それは難しいことではありません。そして、SOは、問題への解決策を喚起するためにここにあります。コピーと貼り付けられたコードのワンストップショップではありません。私はあなたに一般的な原則を示しましたが、あなたのニーズに合わせることはあなた次第です。 – 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

関連する問題