繁体   English   中英

linq/GroupBy/Count 出现问题

[英]Trouble with linq/GroupBy/Count

我有以下数据集:

vehicleid   elapsedTimeLastConnection   timestampLastConnection     avgConnectionDuration
20472       1054471                     2021-04-01 08:45:29.000     195
20400       1048824                     2021-04-01 10:19:36.777     2522
20464       1048764                     2021-04-01 10:20:36.000     1065
26235       1042766                     2021-04-01 12:00:34.000     1028
20472       1029448                     2021-04-01 15:42:32.000     1168
20464       983912                      2021-04-02 04:21:28.777     37
20417       974218                      2021-04-02 07:03:02.000     15031
20422       966875                      2021-04-02 09:05:25.777     3
20422       962542                      2021-04-02 10:17:38.777     2922
26235       961541                      2021-04-02 10:34:19.000     1137
20464       961189                      2021-04-02 10:40:11.000     5362
20472       939075                      2021-04-02 16:48:45.777     763
20473       931086                      2021-04-02 19:01:54.777     3428
20472       885385                      2021-04-03 07:43:35.000     1683
20412       878456                      2021-04-03 09:39:04.777     1601
20400       875267                      2021-04-03 10:32:13.000     322
20398       871287                      2021-04-03 11:38:33.777     1035
26235       863747                      2021-04-03 13:44:13.000     1322
20400       845021                      2021-04-03 18:56:19.000     2471
20410       811539                      2021-04-04 04:14:21.777     1
20410       801662                      2021-04-04 06:58:58.000     1403
20424       787282                      2021-04-04 10:58:38.777     220
20472       783425                      2021-04-04 12:02:55.777     1010
26235       777413                      2021-04-04 13:43:07.000     971
20451       776365                      2021-04-04 14:00:35.777     30
20422       774753                      2021-04-04 14:27:27.777     10
20451       774458                      2021-04-04 14:32:22.000     0
20422       770654                      2021-04-04 15:35:46.777     199
20424       768515                      2021-04-04 16:11:25.777     158
20424       758100                      2021-04-04 19:05:00.777     3420
20422       757804                      2021-04-04 19:09:56.777     1974
26431       749178                      2021-04-04 21:33:42.777     3
26431       744800                      2021-04-04 22:46:40.777     1
26431       743230                      2021-04-04 23:12:50.777     3
20473       725451                      2021-04-05 04:09:09.000     1
26431       724816                      2021-04-05 04:19:44.777     47
20473       724478                      2021-04-05 04:25:22.777     2232
20472       722822                      2021-04-05 04:52:58.000     1
26431       716665                      2021-04-05 06:35:35.777     258
20410       714575                      2021-04-05 07:10:25.777     1750
26235       705768                      2021-04-05 09:37:12.000     440
20472       705134                      2021-04-05 09:47:46.777     1576
26431       693675                      2021-04-05 12:58:45.000     1
20398       677341                      2021-04-05 17:30:59.000     3688
26431       676935                      2021-04-05 17:37:45.000     1
26431       676014                      2021-04-05 17:53:06.777     1075
26235       674789                      2021-04-05 18:13:31.777     7
26235       673755                      2021-04-05 18:30:45.000     802
20400       671561                      2021-04-05 19:07:19.777     529
20464       634465                      2021-04-06 05:25:35.777     1
20400       627857                      2021-04-06 07:15:43.777     1274
26235       623214                      2021-04-06 08:33:06.000     2679
20422       621451                      2021-04-06 09:02:29.777     1
20422       620461                      2021-04-06 09:18:59.777     4185
20464       611819                      2021-04-06 11:43:01.777     1021
26431       611458                      2021-04-06 11:49:02.000     1446
20472       609710                      2021-04-06 12:18:10.777     1360
20410       600170                      2021-04-06 14:57:10.777     12
20410       589821                      2021-04-06 17:49:39.777     610
20473       585735                      2021-04-06 18:57:45.000     1004
20451       583418                      2021-04-06 19:36:22.777     2

我使用以下 linq 查询按星期几分组:

var toBeReturned = dataSet
  .GroupBy(row => new DateTime(row.timestampLastConnection.Ticks).ToLocalTime().DayOfWeek);

这正是我想要的。 到目前为止,一切都很好。

现在我想计算每组不同的车辆ID,所以我最终得到:

var toBeReturned2 = toBeReturned
    .Select(g =>
    {
        int vCount = g.Select(c => c.vehicleId).Distinct().Count();
        return new
        {
            DayOfWeek = g.Key,
            count = vCount,
            duration = g.Average(c => c.avgConnectionDuration) / vCount
        };
    });

问题是vCount 始终为 1 ,而不是选择组的不同车辆 ID 的计数。

{ DayOfWeek = Thursday, count = 1, duration = 997.90909090909088 }
{ DayOfWeek = Friday, count = 1, duration = 2124.2380952380954 }
{ DayOfWeek = Saturday, count = 1, duration = 1329.1666666666667 }
{ DayOfWeek = Sunday, count = 1, duration = 657.05882352941171 }
{ DayOfWeek = Monday, count = 1, duration = 642 }
{ DayOfWeek = Tuesday, count = 1, duration = 1132.9166666666667 }
{ DayOfWeek = Wednesday, count = 1, duration = 891.81818181818187 }

我究竟做错了什么?

尝试缩小问题范围。 如果删除.Distinct()它会返回每个组的完整计数吗? 如果是这样,问题可能是您的vehicleId列的内容。

每条评论:该字段没有被反序列化为 object (错误名称),因此所有值都是 null 或空,因此它们不是不同的。

试试下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;

namespace ConsoleApplication187
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("vehicleid", typeof(int));
            dt.Columns.Add("elapsedTimeLastConnection", typeof(long));
            dt.Columns.Add("timestampLastConnection", typeof(DateTime));
            dt.Columns.Add("avgConnectionDuration", typeof(long));

            int col1Len = "vehicleid   ".Length;
            int col2Len = "elapsedTimeLastConnection   ".Length;
            int col3Len = "timestampLastConnection     ".Length;
            int col4Len = "avgConnectionDuratio".Length;

            StreamReader reader = new StreamReader(FILENAME);
            string line = "";
            int rowCount = 0;
            while((line = reader.ReadLine()) != null)
            {
                if (++rowCount > 1)
                {
                    dt.Rows.Add(new object[] {
                        int.Parse(line.Substring(0,col1Len)),
                        long.Parse(line.Substring(col1Len,col2Len)),
                        DateTime.Parse(line.Substring(col1Len + col2Len,col3Len)),
                        long.Parse(line.Substring(col1Len + col2Len + col3Len))
                    });
                }
            }
            var toBeReturned = dt.AsEnumerable().GroupBy(row => row.Field<DateTime>("timestampLastConnection").ToLocalTime().DayOfWeek);
            var toBeReturned2 = toBeReturned.OrderBy(x => x.Key).Select(x => new { key = x.Key, count = x.Count() }).ToList();

        }
    }
}

一个可能的答案是您的vehicleId未获取并默认为0null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM