有三件事情,要随机分配到一个月中的周六去做,
有四件事情,要随机分配到一个月中的工作日去做,
一天只能做一件事。怎么分配?算法
有四件事情,要随机分配到一个月中的工作日去做,
一天只能做一件事。怎么分配?算法
解决方案 »
- dataReader[]为什么跳出?
- 请问Winform中DataGrid动态增加新的数据行行怎么处理
- 求救啊!~~~ 救命 各位老师帮帮忙
- 用户控件问题,我实在解决不了了,高手闷帮帮忙吧!!!
- C# Rich Textbox 控件如何插入图片??
- .NET中string + string的这个加号操作符是如何实现的?
- 请教高手:应用程序中的服务器错误
- (WinForm)DataGrid的ColumnHeader的高度可以设置吗?
- C#中windows api的一些问题
- oracle如何创建一个触发器,要求实现显示对表插入,删除,修改所影响行的信息,并且需要得到修改的ID号
- 【抱怨】Windows窗体程序中 checkedListBox1 的 DataSource属性 没有代码提示??
- 用C#制作一个动画形式的窗体界面
注释写得很清楚了,看是不是你想要的, /// <summary>
/// 任务分配项
/// </summary>
public class WorkDayInfo
{
public DateTime Date { get; set; }
public Task TaskInfo { get; set; }
}
/// <summary>
/// 具体任务
/// </summary>
public class Task
{
public string Desc { get; set; }
} /// <summary>
/// 安排任务
/// </summary>
/// <param name="date">月份的第一天日期比如:2013-03-01</param>
/// <param name="workDayList">待分配到工作日的任务</param>
/// <param name="satworkDayList">待分配到星期六的任务</param>
/// <returns>返回分配好的任务项</returns>
public List<WorkDayInfo> ArrangeTask(DateTime date, List<Task> workDayList, List<Task> satworkDayList)
{
int days = (date.AddMonths(1) - date).Days;//传入的月份有多少天
var workDayItems = new List<int>();//工作日安排
var satDayItems = new List<int>();//星期六安排
var arrangeTaskItems = new List<WorkDayInfo>();
//生成可分配任务的日期
for (int i = 0; i < days; i++)
{
DateTime current = date.AddDays(i);
if (current.DayOfWeek == DayOfWeek.Sunday) continue;
if (current.DayOfWeek == DayOfWeek.Saturday)
{
satDayItems.Add(i + 1);
continue;
}
workDayItems.Add(i + 1);
}
var rand = new Random((int)DateTime.Now.Ticks);
//分配工作日任务
foreach (var work in workDayList)
{
int randIndex = rand.Next(workDayItems.Count);
int day = workDayItems[randIndex];
arrangeTaskItems.Add(new WorkDayInfo() { Date = date.AddDays(day - 1), TaskInfo = work });
workDayItems.RemoveAt(randIndex);
}
//分配星期六任务
foreach (var work in satworkDayList)
{
int randIndex = rand.Next(satDayItems.Count);
int day = satDayItems[randIndex];
arrangeTaskItems.Add(new WorkDayInfo() { Date = date.AddDays(day - 1), TaskInfo = work });
satDayItems.RemoveAt(randIndex);
}
return arrangeTaskItems;
} 调有方法 var workDayList = new List<Task>()
{
new Task{ Desc="工作日第一件事情"},
new Task{ Desc="工作日第二件事情"},
new Task{ Desc="工作日第三件事情"},
new Task{ Desc="工作日第四件事情"}
};
var satworkDayList = new List<Task>()
{
new Task{ Desc="星期六第一件事情"},
new Task{ Desc="星期六第二件事情"},
new Task{ Desc="星期六第三件事情"},
};
var list = ArrangeTask(new DateTime(2013, 3, 1), workDayList, satworkDayList);
DateTime start = new DateTime(2013, 03, 01);
DateTime end = new DateTime(2013, 03, 31);
List<DateTime> saturdayList = new List<DateTime>();
List<DateTime> workDay = new List<DateTime>();
DateTime now = start;
while (now <= end)
{
if (now.DayOfWeek == DayOfWeek.Saturday)
{
saturdayList.Add(now);
now = now.AddDays(2);
continue;
}
if (now.DayOfWeek != DayOfWeek.Sunday)
{
workDay.Add(now);
now = now.AddDays(1);
}
}
Random ran = new Random();
int index = 0; List<DateTime> someOf3 = new List<DateTime>();
List<DateTime> someOf4 = new List<DateTime>();
for (int i = 0; i < 3; i++)
{
index = ran.Next(0, saturdayList.Count - 1);
now = saturdayList[index];
someOf3.Add(now);
saturdayList.RemoveAt(index);
} for (int i = 0; i < 4; i++)
{
index = ran.Next(0, workDay.Count - 1);
now = workDay[index];
someOf4.Add(now);
workDay.RemoveAt(index);
} Console.WriteLine("3件事分别被分到了:\r\n {0} \r\n {1} \r\n {2}",someOf3[0],someOf3[1],someOf3[2]);
Console.WriteLine("4件事分别被分到了:\r\n {0} \r\n {1} \r\n {2} \r\n {3}", someOf4[0], someOf4[1], someOf4[2],someOf4[3]);/*
3件事分别被分到了:
2013/3/16 0:00:00
2013/3/9 0:00:00
2013/3/2 0:00:00
4件事分别被分到了:
2013/3/15 0:00:00
2013/3/5 0:00:00
2013/3/13 0:00:00
2013/3/27 0:00:00*/
有个小BUG,如果第一天为星期天的话将会进入死循环了。DateTime start = new DateTime(2013, 03, 01);
DateTime end = new DateTime(2013, 03, 31);
List<DateTime> saturdayList = new List<DateTime>();
List<DateTime> workDay = new List<DateTime>();
DateTime now = start;
while (now <= end)
{
if (now.DayOfWeek == DayOfWeek.Saturday)
{
saturdayList.Add(now);
now = now.AddDays(2);
continue;
}
if (now.DayOfWeek != DayOfWeek.Sunday)
{
workDay.Add(now);
now = now.AddDays(1);
continue;
}
//第一天如果为星期天
now = now.AddDays(1);
}
Random ran = new Random();
int index = 0;
List<DateTime> someOf3 = new List<DateTime>();
List<DateTime> someOf4 = new List<DateTime>();
for (int i = 0; i < 3; i++)
{
index = ran.Next(0, saturdayList.Count - 1);
now = saturdayList[index];
someOf3.Add(now);
saturdayList.RemoveAt(index);
}
for (int i = 0; i < 4; i++)
{
index = ran.Next(0, workDay.Count - 1);
now = workDay[index];
someOf4.Add(now);
workDay.RemoveAt(index);
}
Console.WriteLine("3件事分别被分到了:\r\n {0} \r\n {1} \r\n {2}",someOf3[0],someOf3[1],someOf3[2]);
Console.WriteLine("4件事分别被分到了:\r\n {0} \r\n {1} \r\n {2} \r\n {3}", someOf4[0], someOf4[1], someOf4[2],someOf4[3]);
/*
3件事分别被分到了:
2013/3/16 0:00:00
2013/3/9 0:00:00
2013/3/2 0:00:00
4件事分别被分到了:
2013/3/15 0:00:00
2013/3/5 0:00:00
2013/3/13 0:00:00
2013/3/27 0:00:00
*/