c# - 具有偏移量的 GroupBy DateTime 列 C# Linq

标签 c# .net linq

在我的 .NET 4.5.2 C# 控制台应用程序中,我有一个 List<SomeItem>someItemsSomeItem是:

public class SomeItem    {
    public int A { get; set; }
    public int B { get; set; }
    public DateTime C { get; set; }
}

然后,我根据 A 将这些项目分组到一个新列表中和B :

var groupedItems = someItems.GroupBy(x => new { x.A, x.B });

我现在想介绍C进入GroupBy ,但有一个问题:我想组合在一起 SomeItems谁的C属性彼此之间的误差在 +-(正负)2 秒之内(本质上是 2 秒的偏移量)。例如,两个 SomeItem ,其中一个具有 C设置 2016-03-28 17:58:01.000另一个为2016-03-28 17:58:03.000 ,将被分组在一起。这可能吗?

编辑:出于所有意图和目的,我们假设列表中不会有可能导致“重叠”组的项目(如评论中 @J. Steen 的问题)

编辑 2:示例

假设以下数据:

  • 2017年6月15日00:00:02
  • 2017年6月15日00:00:04
  • 2017年6月15日00:00:06
  • 2017年6月15日00:00:09
  • 2017年6月15日00:00:11
  • 2017年6月15日00:00:15

..偏移量为 2秒,我希望它们按以下方式分组:

第 1 组:

  • 2017年6月15日00:00:02
  • 2017年6月15日00:00:04
  • 2017年6月15日00:00:06

第 2 组:

  • 2017年6月15日00:00:09
  • 2017年6月15日00:00:11

第 3 组:

  • 2017年6月15日00:00:15

最佳答案

您的示例输入和输出有点令人困惑。

您的前 3 项 2、4 和 6 存在重叠。 4 可以同时属于 2 和 6。这意味着您需要决定分组将基于哪个项目。如果您以 2 开始分组,那么结果将是

  • 第 1 组:2,4
  • 第 2 组:6 人,
  • 第 3 组:9、11
  • 第 4 组:15

看来你运用了你的人脑发现,如果起点是 4 秒,实际上 6 个人可以加入第一组。这些组将变成:

  • 第 1 组:2,4,6
  • 第 2 组:9、11
  • 第 3 组:15

您可以创建 IEqualityComparer<DateTime>但是,要执行此操作,您的分组取决于集合的顺序:

public class GroupingComparer : IEqualityComparer<DateTime>
{
    private readonly int _offset;

    public GroupingComparer(int offset)
    {
        _offset = offset;
    }

    public bool Equals(DateTime x, DateTime y)
    {
        if (y.Second >= x.Second - _offset && y.Second <= x.Second + _offset) return true;

        return false;
    }

    public int GetHashCode(DateTime obj)
    {
        //Should most probably look at a better way to get the hashcode.
        return obj.ToShortDateString().GetHashCode();
    }
}

像这样使用它:

GroupingComparer comparer = new GroupingComparer(offset:2);
var result2 = dates.GroupBy(x => x, comparer).ToList(); 

所以现在一切都取决于你想做什么。您可以通过更改集合的顺序来获得上述任一输出。但是,如果您在应用程序的不同部分使用不同的顺序,这可能意味着应用程序中出现奇怪的行为。也许是一个扩展方法OrderAndGroup可以解决这个问题。

关于c# - 具有偏移量的 GroupBy DateTime 列 C# Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569091/

相关文章:

c# - 使用 Expression 类构造 LINQ 表达式时按正则表达式搜索

c# - 在 Visual Studio 代码分析中使用 CustomDictionary.xml 进行花式标识符

c# - 当某些转换可能为空时使用 LINQ convertAll

c# - 是否可以为字符串实现 ExpressionTree.GreaterThan 等,以便 LINQ 可以使用它

C# Lambda 表达式 - 从字符串获取属性值

c# - 在动态构建的表达式上调用 ToString()

c# - 尝试解析标记助手指令 '@addTagHelper' 时遇到意外错误

C# - 带有 OR 子句的 LINQ 语句

c# - Microsoft.Office.Interop.Word 命名空间覆盖我的系统命名空间? C# ASP.net

c# - 在编译时约束 const 变量