C# C根据相同的开放时间和结束时间合并天数
我想把商店营业时间相似的日子合并在一起。例如,如果我们有:C# C根据相同的开放时间和结束时间合并天数,c#,asp.net,C#,Asp.net,我想把商店营业时间相似的日子合并在一起。例如,如果我们有: Mon 9am-5pm Tue 9am-5pm Wed 9am-5pm Thu 8am-6pm Fri 8am-6pm Sat 10am-2pm 我希望代码将其简化为: Mon-Wed 9am-5pm Thu-Fri 8am-6pm Sat 10am-2pm Sun - 如果没有很长的if/else列表,我该怎么做 这里有一种使用最小显式条件逻辑的方法。该策略是:1将数据转换为对象;2根据在1中创建的对象执行合并:
Mon 9am-5pm
Tue 9am-5pm
Wed 9am-5pm
Thu 8am-6pm
Fri 8am-6pm
Sat 10am-2pm
我希望代码将其简化为:
Mon-Wed 9am-5pm
Thu-Fri 8am-6pm
Sat 10am-2pm
Sun -
如果没有很长的if/else列表,我该怎么做 这里有一种使用最小显式条件逻辑的方法。该策略是:1将数据转换为对象;2根据在1中创建的对象执行合并:
// mimic data from databasse
var days = new[] {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
var openTime = new[] {"9am", "9am", "9am", "8am", "8am", "10am"};
var closeTime = new[] {"5pm", "5pm", "5pm", "6pm", "6pm", "2pm"};
// lookup of day code to DayOfWeek enum
var dayOfWeekMap = Enum.GetNames(typeof(DayOfWeek))
.ToDictionary(
x => x.Substring(0, 3),
x => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), x));
// convert data to objects
var dayStoreHours =
Enumerable.Range(0, days.Count())
.Select(idx => new StoreHours {
DayOfWeek = dayOfWeekMap[days[idx]],
OpenTime = DateTime.ParseExact(
openTime[idx],
"htt", CultureInfo.InvariantCulture)
.TimeOfDay,
CloseTime = DateTime.ParseExact(
closeTime[idx],
"htt", CultureInfo.InvariantCulture)
.TimeOfDay
})
.ToDictionary(x => x.DayOfWeek, x => x);
// merge consecutive days if open and close time match
var mergedStoreHours = new HashSet<MergedStoreHours>();
var currentMergedHours = default(MergedStoreHours);
Enum.GetNames(typeof(DayOfWeek))
.Select(x => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), x))
.ToList()
.ForEach(dow => {
if (!dayStoreHours.ContainsKey(dow)) {
// there are not hours recorded for the current day
// create an entry for this day with identical open and close time
mergedStoreHours.Add(
new MergedStoreHours {
FirstDayOfWeek = dow,
LastDayOfWeek = dow
});
return;
}
var currentDayStoreHours = dayStoreHours[dow];
if (currentMergedHours != default(MergedStoreHours) &&
currentDayStoreHours.OpenTime == currentMergedHours.OpenTime &&
currentDayStoreHours.CloseTime == currentMergedHours.CloseTime
) {
// extend the merged hours to the current day
currentMergedHours.LastDayOfWeek = dow;
} else {
currentMergedHours = new MergedStoreHours {
FirstDayOfWeek = dow,
LastDayOfWeek = dow,
OpenTime = currentDayStoreHours.OpenTime,
CloseTime = currentDayStoreHours.CloseTime
};
}
mergedStoreHours.Add(currentMergedHours);
});
// order in increasing day of the week, placing sunday last
var orderMergedHours = mergedStoreHours
.OrderBy(x => x.FirstDayOfWeek == DayOfWeek.Sunday ? 8 : x.FirstDayOfWeek.GetHashCode())
.ToList();
只要把我的两分钱放进去:
void Main()
{
var dt = new DataTable();
dt.Columns.Add("DayName");
dt.Columns.Add("From");
dt.Columns.Add("To");
AddDay(dt, "Mon", "9am", "5pm");
AddDay(dt, "Tue", "9am", "5pm");
AddDay(dt, "Wed", "9am", "5pm");
AddDay(dt, "Thu", "8am", "6pm");
AddDay(dt, "Fri", "8am", "6pm");
AddDay(dt, "Sat", "10am", "2pm");
AddDay(dt, "Sun", "", "");
var combined = GetCombinedOpeningHours(dt);
Console.WriteLine(combined);
}
void AddDay(DataTable dt, string dayName, string fromTime, string toTime)
{
var row = dt.NewRow();
row["DayName"] = dayName;
row["From"] = fromTime;
row["To"] = toTime;
dt.Rows.Add(row);
}
Dictionary<string,string> GetCombinedOpeningHours(DataTable dt)
{
(dt.Columns.Add("OpeningHours")).Expression = "From+'-'+To";
var groupedByOpeningHours = from day in dt.AsEnumerable()
group day by day.Field<string>("OpeningHours") into g
select g;
var combined = new Dictionary<string,string>();
foreach(var grp in groupedByOpeningHours)
{
var firstDay = grp.FirstOrDefault().Field<string>("DayName");
var lastDay = grp.LastOrDefault().Field<string>("DayName");
var key = (firstDay == lastDay) ? firstDay : firstDay + "-" + lastDay;
if (!combined.ContainsKey(key))
combined.Add(key, grp.FirstOrDefault().Field<string>("OpeningHours"));
}
return combined;
}
数据来自哪里?以什么格式?字符串列表等?您的代码看起来怎么样?到目前为止您尝试了什么?@Fred表中有数据。有三列。DayName,From,Tothanks为答案。只是一个注释,排序根本不起作用。OrderByx=>x.FirstDayOfWeek。星期天总是排在第一位。在美国,传统的日子顺序是以星期天开始一周。DayOfWeek枚举是基于该约定排序的。可以很容易地将排序更改为最后一个星期天,如下所示:var orderMergedHours=mergedstorehurs.OrderByx=>x.FirstDayOfWeek==DayOfWeek.Sunday?8:x.FirstDayOfWeek.GetHashCode.ToList;
void Main()
{
var dt = new DataTable();
dt.Columns.Add("DayName");
dt.Columns.Add("From");
dt.Columns.Add("To");
AddDay(dt, "Mon", "9am", "5pm");
AddDay(dt, "Tue", "9am", "5pm");
AddDay(dt, "Wed", "9am", "5pm");
AddDay(dt, "Thu", "8am", "6pm");
AddDay(dt, "Fri", "8am", "6pm");
AddDay(dt, "Sat", "10am", "2pm");
AddDay(dt, "Sun", "", "");
var combined = GetCombinedOpeningHours(dt);
Console.WriteLine(combined);
}
void AddDay(DataTable dt, string dayName, string fromTime, string toTime)
{
var row = dt.NewRow();
row["DayName"] = dayName;
row["From"] = fromTime;
row["To"] = toTime;
dt.Rows.Add(row);
}
Dictionary<string,string> GetCombinedOpeningHours(DataTable dt)
{
(dt.Columns.Add("OpeningHours")).Expression = "From+'-'+To";
var groupedByOpeningHours = from day in dt.AsEnumerable()
group day by day.Field<string>("OpeningHours") into g
select g;
var combined = new Dictionary<string,string>();
foreach(var grp in groupedByOpeningHours)
{
var firstDay = grp.FirstOrDefault().Field<string>("DayName");
var lastDay = grp.LastOrDefault().Field<string>("DayName");
var key = (firstDay == lastDay) ? firstDay : firstDay + "-" + lastDay;
if (!combined.ContainsKey(key))
combined.Add(key, grp.FirstOrDefault().Field<string>("OpeningHours"));
}
return combined;
}