如何根据日历发生情况对一周中的日期列表进行排序

时间:2017-06-17 21:38:42

标签: c# android list

我有一个按星期排序天数的功能,因为它们可能不合适,但结果不能按预期工作。我做错了什么?

        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;

        }

2 个答案:

答案 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
        }