联盟中的IEqualityComparer没有比较预期值

时间:2015-06-23 12:23:36

标签: .net iequalitycomparer

我正在尝试用NAN填充一组时间数据中的间隙以用于绘图目的。我试图通过为所有可能的时间段创建一组NAN数据并使用Union将它们合并在一起来做到这一点。我希望真正的数据覆盖NAN值,留下我想要的数据集。

这是我设置NAN数据集和代码的代码。覆盖(使用先前获得的AveragedData):

        //Calculate time period
        var days = (int)(endDate - startDate).TotalMinutes + 1;

        //create a set of minute data for the correct time-range
        var clockQuery = from offset in Enumerable.Range(0, days)
                         select TimeSpan.FromMinutes(
        var completeSequence = clockQuery.Select(add => minRoundStartDate.Add(add));

        //Create the NAN dataset
        var nullData = from date in completeSequence
                                     select new SensorValue{ MeasureTime = date, Value = double.NaN };

        //Merge data
        var mergedData = nullData.Union(AveragedData, new SensorValueComparer()).ToList();

这是SensorValueComparer。起初我只是“比较”并测试了0,但它没有达到任何值,所以我测试了添加一个点,当两个日期完全相同时(分钟数据应该发生很多)。但是那个断点也没有受到打击。我已经检查过,mergedData包含两个数据集,以及与MeasuredData相等的场合。

    public class SensorValueComparer : IEqualityComparer<SensorValue>
    {
        public bool Equals(SensorValue x, SensorValue y)
        {
            var ret = x.MeasureTime.CompareTo(y.MeasureTime);
            if (x.MeasureTime.ToOADate() == y.MeasureTime.ToOADate())// && x.MeasureTime.Hour == y.MeasureTime.Hour && x.MeasureTime.Minute == y.MeasureTime.Minute)
            {
                System.Console.WriteLine("Test");
            }
            return ret == 0;
        }

        public int GetHashCode(SensorValue obj)
        {
            return obj.MeasureTime.GetHashCode();
        }
    }

任何人都可以帮助解决为什么这个Union功能没有正确合并重复项?我使用不正确吗?

干杯

1 个答案:

答案 0 :(得分:0)

我通过使用Linq语句而不是Union解决了这个问题。我不得不重新分组,因为之前的方法没有产生精确到minuite的时间:

        //merge Data
        var mergedData = (nullData.Concat(AveragedData)
                                 .GroupBy(x => {
                                        return new DateTime(x.MeasureTime.Year, x.MeasureTime.Month, x.MeasureTime.Day,
                                            x.MeasureTime.Hour, x.MeasureTime.Minute, 0);
                                    })
                                 .Select(g => new SensorValue
                                 {
                                     MeasureTime = g.Key,
                                     Value = g.Max(x => x.Value)
                                 }).OrderBy(x => x.MeasureTime)).ToList();