我有一个按星期排序天数的功能,因为它们可能不合适,但结果不能按预期工作。我做错了什么?
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;
}
答案 0 :(得分:1)
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
enum并使用了你自己的定位,这当然不是这样做的。
答案 1 :(得分:0)
@Clint提交的代码有效,为了使星期一成为一周的第一天,我更改了DayOfWeek的枚举值。
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Monday = 0,
Tuesday = 1,
Wednesday = 2,
Thursday = 3,
Friday = 4,
Saturday = 5,
Sunday = 6
}