Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Facebook采访问题:格式化电影放映时间输出的时间集合(首选使用Linq)_C#_Linq_Facebook_Date - Fatal编程技术网

C# Facebook采访问题:格式化电影放映时间输出的时间集合(首选使用Linq)

C# Facebook采访问题:格式化电影放映时间输出的时间集合(首选使用Linq),c#,linq,facebook,date,C#,Linq,Facebook,Date,问题是:我必须弄清楚如何输出上面的字符串 我提到,我知道C#,面试官坚持知道如何用最少的可读代码行完成这项工作,最好使用LINQ。他说,我可以将其写入控制台,但我必须记住将AM和PM本地化 很明显,我创建了一堆临时集合和废话,完全搞砸了。他声称这只是LINQ的几行。我尝试了其他的事情,尽管他一直引导我去林克 帮忙?有人有想法吗?这真的让我一整天都很难受 更新-我得到了这份工作!他们还要求我编辑距离{HELLO}-->{HLO},告诉我到达最终字符串所需的最小编辑/更新次数。世界上有蜜蜂和蜂蜜,只

问题是:我必须弄清楚如何输出上面的字符串

我提到,我知道C#,面试官坚持知道如何用最少的可读代码行完成这项工作,最好使用LINQ。他说,我可以将其写入控制台,但我必须记住将AM和PM本地化

很明显,我创建了一堆临时集合和废话,完全搞砸了。他声称这只是LINQ的几行。我尝试了其他的事情,尽管他一直引导我去林克

帮忙?有人有想法吗?这真的让我一整天都很难受

更新-我得到了这份工作!他们还要求我编辑距离{HELLO}-->{HLO},告诉我到达最终字符串所需的最小编辑/更新次数。世界上有蜜蜂和蜂蜜,只有一只蜂王,只有通过蜂王才能获得蜂蜜。构建一个可以支持此操作的虚拟计算机世界,并判断该世界是否存在冲突--图形,根节点是蜂王,节点是蜜蜂和蜜蜂,运行二分测试以查看世界是否存在冲突。

[edit]
我相信有一个更干净的方法可以做到这一点,但这就是我所拥有的。如果没有时间格式限制,一个简单的分组会更容易。我会试着想出另一个版本

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());