【问题标题】:Linq groupBy IGrouping to List<> in a simple/clean wayLinq groupBy IGrouping to List<> 以简单/干净的方式
【发布时间】:2017-02-09 12:29:13
【问题描述】:

我已经对这种方法进行了重构。在我们有很多循环和虚拟代码之前。这是我能做到的,但我认为我可以更简单。

我想我可以直接从 from * 组中选择并以正确的方式放入列表中。

这可能吗?或者我必须有这个循环?

private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches)
{
    List<ESMatchDate> lMatchDates = new List<ESMatchDate>();

    if (null != matches && matches.Any())
    {
        var dates = from ESMatch in matches
                group ESMatch by ESMatch.BeginDate.ToShortDateString() into newGroup
                orderby Convert.ToDateTime(newGroup.Key)
                select newGroup;

        foreach (var d in dates)
            lMatchDates.Add( new ESMatchDate 
                { Date = Convert.ToDateTime(d.Key), Matches = d.ToList()} );

    }
    else
        lMatchDates = null;

    return lMatchDates;
}

【问题讨论】:

  • 最好在 codereview.stackexchange.com 中询问
  • 顺便说一句,我假设 BeginDate 是一个 DateTime 变量,你想截断时间。您通过字符串和转换的方法不好,请使用:group ESMatch by ESMatch.BeginDate.Date into newGroup。那么你就不需要做任何转换了

标签: c# linq group-by


【解决方案1】:

你已经很接近了,但你不需要手动 Add 到列表中 - LINQ 可以为你做这一切

private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches)
{

    if (null == matches || !matches.Any())
    {
        return null;
    }
    return matches.GroupBy(x => x.BeginDate.Date)
                  .OrderBy(x => x.Key)
                  .Select(x => new ESMatchDate{ Date = x.Key, Matches = x.ToList() }) 
                  .ToList();
}

请注意,这与之前的答案相同,只是使用 Lamda 语法进行比较。我个人更喜欢这种语法,但这只是个人喜好问题。

【讨论】:

    【解决方案2】:

    只需在select中做投影:

    private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches)
    {
        if (matches == null || !matches.Any())
        {
            return null;
        }
    
        return (from ESMatch in matches
                group ESMatch by ESMatch.BeginDate.Date into newGroup
                orderby Convert.ToDateTime(newGroup.Key)
                select new ESMatchDate 
                {
                    Date = newGroup.Key,
                    Matches = newGroup.ToList()
                }).ToList();
    }
    

    【讨论】:

    • 来回返回日期字符串有点过时了。就做ESMatch.BeginDate.Date
    • 小问题,OP想要返回一个列表,即使你的方法编译它也不一样。
    • @Jamiec - 谢谢 :) 已修复
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多