C# Facebook采访问题:格式化电影放映时间输出的时间集合(首选使用Linq)
问题是:我必须弄清楚如何输出上面的字符串 我提到,我知道C#,面试官坚持知道如何用最少的可读代码行完成这项工作,最好使用LINQ。他说,我可以将其写入控制台,但我必须记住将AM和PM本地化 很明显,我创建了一堆临时集合和废话,完全搞砸了。他声称这只是LINQ的几行。我尝试了其他的事情,尽管他一直引导我去林克 帮忙?有人有想法吗?这真的让我一整天都很难受 更新-我得到了这份工作!他们还要求我编辑距离{HELLO}-->{HLO},告诉我到达最终字符串所需的最小编辑/更新次数。世界上有蜜蜂和蜂蜜,只有一只蜂王,只有通过蜂王才能获得蜂蜜。构建一个可以支持此操作的虚拟计算机世界,并判断该世界是否存在冲突--图形,根节点是蜂王,节点是蜜蜂和蜜蜂,运行二分测试以查看世界是否存在冲突。[edit]C# Facebook采访问题:格式化电影放映时间输出的时间集合(首选使用Linq),c#,linq,facebook,date,C#,Linq,Facebook,Date,问题是:我必须弄清楚如何输出上面的字符串 我提到,我知道C#,面试官坚持知道如何用最少的可读代码行完成这项工作,最好使用LINQ。他说,我可以将其写入控制台,但我必须记住将AM和PM本地化 很明显,我创建了一堆临时集合和废话,完全搞砸了。他声称这只是LINQ的几行。我尝试了其他的事情,尽管他一直引导我去林克 帮忙?有人有想法吗?这真的让我一整天都很难受 更新-我得到了这份工作!他们还要求我编辑距离{HELLO}-->{HLO},告诉我到达最终字符串所需的最小编辑/更新次数。世界上有蜜蜂和蜂蜜,只
我相信有一个更干净的方法可以做到这一点,但这就是我所拥有的。如果没有时间格式限制,一个简单的分组会更容易。我会试着想出另一个版本
class TimeObject
{
DateTime time;
bool isMatinee;
}
Given: {8:00, 9:30, 11:00, 12:10, 2:00, 4:00, 5:20} -- a collection of TimeObjects
Output: (8:00AM, 9:30, 11:00, 12:10PM, 2:00), 4:00, 5:20 -- return a string, oh and AM/PM should be picked up from localization strings
Caveats: AM/PM only shown for first time, ( ) encloses those elements whose matinee bool was set to true.
这个怎么样
var output = String.Join(", ",
times.GroupBy(to => to.isMatinee, to => to.time.ToString("h:mm"))
.Select(g => g.Key ? "(" + String.Join(", ", g) + ")"
: String.Join(", ", g)));
这将允许将任意天数分组在一起,同时仍将AM和PM分开
我希望这会有所帮助。bool amshow=false;
group g by g.time.Date.AddHours(g.time.Hour < 12 ? 0.0 : 12:00) into ggs
bool pmshow=false;
StringBuilder sb=新的StringBuilder();
//假设它首先使用false分组:
foreach(collection.GroupBy中的var timeObjGrp(p=>p.isMatinee))
{
if(grpTimeObj.Key)StringBuilder.Append(“”);
foreach(timeObjGrp中的var timeObjItem)
{
追加(timeObjItem.time.ToString(“h:m”);
//IsAM应该是小于12小时的时间
如果(!amshow&&timeObjItem.time.IsAM)
{
StringBuilder.Append(“AM”);
amshow=true;
}
如果(!pmshow&&timeObjItem.time.IsPM)
{
StringBuilder.Append(“PM”);
pm=true;
}
StringBuilder.Append(“,”);
}
//这里放一些东西来去掉最后一个逗号
if(grpTimeObj.Key)StringBuilder.Append(“)”;
StringBuilder.Append(“,”);
}
//这里放一些东西来去掉最后一个逗号
我不确定它是否足够灵巧,但它是可读的我很难称之为简短(且可读),但它几乎都是灵巧的,至少:
bool AMShown = false;
bool PMShown = false;
StringBuilder sb = new StringBuilder();
//assuming it groups with false first:
foreach(var timeObjGrp in collection.GroupBy(p=>p.isMatinee))
{
if (grpTimeObj.Key) StringBuilder.Append("(");
foreach (var timeObjItem in timeObjGrp)
{
StringBuilder.Append(timeObjItem.time.ToString("h:m"));
//IsAM should be something like Hours < 12
if (!AMShown && timeObjItem.time.IsAM)
{
StringBuilder.Append("AM");
AMShown = true;
}
if (!PMShown && timeObjItem.time.IsPM)
{
StringBuilder.Append("PM");
PMShown = true;
}
StringBuilder.Append(",");
}
//here put something to remove last comma
if (grpTimeObj.Key) StringBuilder.Append(")");
StringBuilder.Append(",");
}
//here put something to remove last comma
变量输出组=
从给定的项目
让我们来看看这个后缀=
object.ReferenceEquals(项,给定.FirstOrDefault(to=>to.Time.Hour<12))||
object.ReferenceEquals(项,给定.FirstOrDefault(to=>to.Time.Hour>=12))
让suffix=needSuffix?“tt”:string.Empty//可以使用资源中的AM/PM而不是日期时间格式字符串
设timeFormat=string.Format(“H:mm{0}”,后缀)
将item.Time.ToString(timeFormat)按item.IsMatinee分组到日场组中
orderby日场组。键降序
让items=string.Join(“,”,日场组.ToArray())
让格式=日场组。键?"({0})" : "{0}"
选择string.Format(格式,项目);
var result=string.Join(“,”,outputGroups.ToArray());
那么到目前为止我们得到了什么呢?没有什么,我想使用堆栈,但是meh,他不喜欢。输出中第一次很多次的括号是什么意思,为什么只有两次的am/pm在旁边?()意味着所有这些元素的isMatinee都设置为true。这就是整个编程问题,只有第一次am,第一个pm除了他们之外还有一个am pm。这很简单,这完全不是我的问题。问题是这样输出字符串。我对问题进行了编辑,以使其更加清晰。我认为IsMatinee将填充在对象的初始列表中。考虑到时间不是24小时格式,这个标志将被用来确定这是一部下午还是(清晨)的电影。。。看起来还不错。我还是不明白它怎么会打印PM和AM只有一次!我当时的想法是,有两种方式来分组,一种是日场,另一种是一天中的时间。日场组将被帕伦夫妇包围,而时间组只有一个领先的格式。然后以某种方式将这些组相互叠加。这是叠加,使它很难容易做到。嗯,好吧,那么这个“我”来自哪里?这是什么意思?什么是repr?让我试试这个。我理解外线。Join只是把整件事浓缩起来。内在的有点难以理解。什么是ggs?最后一次替换是为了什么?好的,如果我有一个多天的列表,我将如何修改此代码?我想我也可以把你的答案记下来,它确实比另一个更简洁,只是另一个让我更明白。非常感谢!使用LINQ的原因是为了避免出现AMSHOWED、PMSHOWED等状态信息。我仍在努力想其他人的解决方案,不过还是要谢谢你。
var output =
String.Join(", ",
from g in given
orderby g.time
group g by g.time.Hour < 12 into ggs
select
String.Join(", ", ggs.Select((x, n) =>
{
var template = n == 0 ? "{0:h:mmtt}" : "{0:h:mm}";
template = x.isMatinee ? String.Format("({0})", template) : template;
return String.Format(template, x.time);
}).ToArray())
).Replace("), (", ", ");
group g by g.time.Date.AddHours(g.time.Hour < 12 ? 0.0 : 12:00) into ggs
bool AMShown = false;
bool PMShown = false;
StringBuilder sb = new StringBuilder();
//assuming it groups with false first:
foreach(var timeObjGrp in collection.GroupBy(p=>p.isMatinee))
{
if (grpTimeObj.Key) StringBuilder.Append("(");
foreach (var timeObjItem in timeObjGrp)
{
StringBuilder.Append(timeObjItem.time.ToString("h:m"));
//IsAM should be something like Hours < 12
if (!AMShown && timeObjItem.time.IsAM)
{
StringBuilder.Append("AM");
AMShown = true;
}
if (!PMShown && timeObjItem.time.IsPM)
{
StringBuilder.Append("PM");
PMShown = true;
}
StringBuilder.Append(",");
}
//here put something to remove last comma
if (grpTimeObj.Key) StringBuilder.Append(")");
StringBuilder.Append(",");
}
//here put something to remove last comma
var outputGroups =
from item in given
let needSuffix =
object.ReferenceEquals(item, given.FirstOrDefault(to => to.Time.Hour < 12)) ||
object.ReferenceEquals(item, given.FirstOrDefault(to => to.Time.Hour >= 12))
let suffix = needSuffix ? "tt" : string.Empty // could use AM/PM from resources instead of DateTime format string
let timeFormat = string.Format("H:mm{0}", suffix)
group item.Time.ToString(timeFormat) by item.IsMatinee into matineeGroup
orderby matineeGroup.Key descending
let items = string.Join(", ", matineeGroup.ToArray())
let format = matineeGroup.Key ? "({0})" : "{0}"
select string.Format(format, items);
var result = string.Join(", ", outputGroups.ToArray());