如何按年和月分组?

时间:2017-08-04 10:59:24

标签: c# linq

我有2列DataTable:Id(长),日期(DataTime)。 如何将其分组以获取linq中的分组列表:

2017.08.03
      345675
      877685
2017.08.04
      988798
      898967
      675675

接下来,我必须将每个组作为参数发送到存储过程。 我可以在数据表中有大约300000行,因此linq扩展应该很快。

确定。现在,我想做一些关于团体的事情。我怎么能这样做?

var GroupedbyDates = dataTable.AsEnumerable().GroupBy(x => ((DateTime)x["Date"]).Date);

 for (var i = 0; i < threadCount; i++)
 {
                Task task = Task.Factory.StartNew(DoSomething);
                tasks.Add(task);
 }

private DoSomething()
{
    while (true)
    {
        var item = ?? //one of groups;

         if (item != null)
         {
            var result = DoSomething2();
            HandleResult(result);
         }             
    }
}

如何迭代IGrouped ??

更新

我有这样的事情:

var r = dataTable.AsEnumerable()
    .GroupBy(x => ((DateTime)x["Date"]).Year) 
    .ToDictionary(year => year.Key, g => g.GroupBy(x =>  
      ((DateTime)x["Date"]).Month)                                   
    .ToDictionary(month => month.Key,  d => d
    .Select(t => new { Root_Id = t["Id"] })));

为:

2017.08.03
      345675
      877685
2017.08.04
      988798
      898967
      675675

3 个答案:

答案 0 :(得分:8)

使用Enumerable.GroupBy

var grouped = table.AsEnumerable().GroupBy(x = > new { x.Date.Year, x.Date.Month });

答案 1 :(得分:0)

根据问题中的示例,按日期

获取群组
Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub chkNotKnown_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkNotKnown.CheckedChanged
        With txtDrCode
            If chkNotKnown.Checked Then
                .Text = "Not Known"
                .Enabled = False
            Else
                .Text = ""
                .Enabled = True
            End If
        End With
    End Sub
End Class

您可以使用2017.08.03 345675 877685 2017.08.04 988798 898967 675675 属性按纯日期删除时间部分和组项

DateTime.Date

答案 2 :(得分:-1)

这个解决方案怎么样? 不要忘记使用AsParallel()来使这个LINQ在大数据上更有效。

// dt - your DataTable with DataRows, where dataRow[0] - is int id, and dataRow[1] - is DateTime.
dt.Rows.AsParallel()
                .ConvertAll(dr => new
                {
                    id = int.Parse((dr as DataRow)[0].ToString()),
                    dateTime = new TimeSpan(DateTime.Parse((dr as DataRow)[1].ToString()).Ticks),
                })
                .GroupBy(objIdDate => objIdDate.dateTime.TotalDays);