通过扫描多个集合来构建缺失值列表

时间:2014-02-05 10:06:44

标签: c# .net linq c#-4.0

我有多个时间序列(例如下面的例子)。我需要扫描这些多个列表并构建缺失值列表。有人可以建议一种方法吗?

public class TimeSeries
    {
        public int GroupId { get; set; }

        public DateTime DateTime { get; set; }    

        public double Value { get; set; }   
    }

我有3个列表(缩写到下表中);每个系列都有相同的日期时间和时间。它的价值。因此gp1Series将具有datetime和value1,gp2Series将具有相同的datetime和value2,并且gp3Series将具有相同的datetime和value3。

Date            Value1  Value2  Value3
30/01/2014 23:00    748 -1  1
30/01/2014 23:30    747 1   1
31/01/2014 00:00    746 1   1
31/01/2014 00:30    745 1   1
31/01/2014 01:00    745 1   1
31/01/2014 01:30    744 1   1
31/01/2014 02:00    743 1   1
31/01/2014 02:30    0   0   0
31/01/2014 03:00    743 1   1
31/01/2014 03:30    742 1   1
31/01/2014 04:00    741 1   1
31/01/2014 04:30    740 1   1
31/01/2014 05:00    0   0   1

只有当同一日期时间的所有3个值都为0时,我才需要将它们添加到新列表中。因此,在上面的示例31/01/2014中,需要将2:30添加到新列表中,因为所有列表的值都为0.但是31/01/2014 05:00将不需要添加到新列表中因为value3不为零。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您可以获取所有三个列表中的值为零的DateTime:

from v1 in gp1Series
join v2 in gp2Series on v1.DateTime equals v2.DateTime
join v3 in gp3Series on v2.DateTime equals v3.DateTime
where v1.Value == 0 && v2.Value == 0 && v3.Value == 0
select v1.DateTime

另一种方法(受@jim启发)

gp1Series.Where(ts => ts.Value == 0)
         .Concat(gp2Series.Where(ts => ts.Value == 0))
         .Concat(gp3Series.Where(ts => ts.Value == 0))
         .GroupBy(ts => ts.DateTime)
         .Where(g => g.Count() == 3)
         .Select(g => g.Key)

如果您需要TimeSeries个实例,则可以在第一种情况下选择new { v1, v2, v3 },或者只是在第二种情况下删除投影。