【问题标题】:LINQ how to return group by as List?LINQ如何以列表形式返回分组?
【发布时间】:2020-12-16 15:39:05
【问题描述】:

我有一个数据表,其中填充了 2 列,即 DateTime 和 Data。我已经能够使用以下方法对列表进行分组:

var dates = table.AsEnumerable().GroupBy(x => Convert.ToDateTime(x["DateTime"]).ToShortDateString());

转换是删除日期时间的“时间”部分,因为我每天只需要 1 个日期,因此我可以对其进行迭代。

我可以在调试过程中看到 LINQ 按我的预期运行,但我几乎没有 LINQ 经验,我不知道如何以可迭代的方式返回这些结果。

在我的 LINQ 语句下面:

foreach (string date in dates) {
    string dummy2 = "";
}

foreach 出现错误提示

Cannot convert type 'System.Linq.IGrouping<string, System.Data.DataRow>' to 'string'

这里的目标是返回一个唯一日期列表,我可以对其进行迭代以对数据表执行额外的处理/LINQ 查询

【问题讨论】:

  • date.Key 是日期字符串(Key 是用于分组的属性)

标签: c# linq .net-core


【解决方案1】:

如果你只想要日期,那么你不需要使用GroupBy,你可以使用Distinct。此外,您可以将它们作为DateTime 对象获取,只需获取Date 属性,该属性具有归零的时间组件:

IEnumerable<DateTime> distinctDates = table.AsEnumerable()
    .Select(x => Convert.ToDateTime(x["DateTime"]).Date)
    .Distinct();

如果您想要组但只是尝试从中选择日期字符串,那么您想使用组的 Key 属性,该属性用于对项目进行分组:

IEnumerable<IGrouping<string, System.Data.DataRow>> dates = table.AsEnumerable()
    .GroupBy(x => Convert.ToDateTime(x["DateTime"]).ToShortDateString());

List<string> distinctDates = dates.Select(date => date.Key).ToList();

附带说明,除非您知道某物返回的数据类型,否则您可能会避免使用 var,因为这隐藏了 dates 不是字符串集合的事实。

【讨论】:

    【解决方案2】:

    如果你想要一个唯一日期的列表,你可以这样做。

    var dates = table.Select(x => Convert.ToDateTime(x["DateTime"]).ToShortDateString()).Distinct();
    

    【讨论】:

    • 这是我最喜欢的答案,因为它消除了不必要的分组。现在我有var dates = table.AsEnumerable().Select(x =&gt; Convert.ToDateTime((x["DateTime"])).Date).Distinct().ToList();,它给了我一个日期时间列表
    【解决方案3】:

    发生这种情况是因为错误表明您正在尝试在字典中循环:

    Cannot convert type 'System.Linq.IGrouping<string, System.Data.DataRow>' to 'string'
    

    您可以做的是在您的GroupBy 语句中添加select 部分:

    var dates = table.AsEnumerable().GroupBy(x => Convert.ToDateTime(x["DateTime"]).ToShortDateString()).Select(x=> x.date);
    

    【讨论】:

    • .date 在 IGrouping 上无效。
    • 这是我现在需要做的其他程序的有用信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2018-01-09
    相关资源
    最近更新 更多