按x秒范围内的值分组时间跨度列表

时间:2018-01-28 19:44:20

标签: c# linq

我在列表中有以下值:

[0] {-00:00:14.7100000} System.TimeSpan
[1] {-00:00:14.7000000} System.TimeSpan
[2] {-00:00:14.6900000} System.TimeSpan
[3] {-00:00:15.2000000} System.TimeSpan
[4] {-00:00:00.1300000} System.TimeSpan
[5] {-00:00:00.1200000} System.TimeSpan
[6] {-00:00:00.1000000} System.TimeSpan
[7] {-00:00:00.0900000} System.TimeSpan

现在我想以下列方式对这些值进行分组。 第1组:

[0] {-00:00:14.7100000} System.TimeSpan
[1] {-00:00:14.7000000} System.TimeSpan
[2] {-00:00:14.6900000} System.TimeSpan
[3] {-00:00:15.2000000} System.TimeSpan

和 第2组:

[0] {-00:00:00.1300000} System.TimeSpan
[1] {-00:00:00.1200000} System.TimeSpan
[2] {-00:00:00.1000000} System.TimeSpan
[3] {-00:00:00.0900000} System.TimeSpan

这样我可以在以后建立平局并得到: -14.826 -0.11

我将获取列表的第一个元素,并查找该值范围内的任何值(在我的情况下,3秒应该没问题)。然后我删除旧列表中的匹配项并将其添加到新列表中。我想我必须使用嵌套的'for循环',但我不知道具体如何。你会怎么做?

修改 列表中的值是随机的。这意味着事先定义组将无法完成工作。我扩展了示例列表。

EDIT2: Tim S.的答案对我有用。感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用简单的while循环和一些LINQ来完成此操作。我还使用yield return来使代码可读。

private static readonly TimeSpan GapSize = TimeSpan.FromSeconds(3);

public static IEnumerable<IEnumerable<TimeSpan>> GetGroups(IEnumerable<TimeSpan> timespans)
{
    var timespansList = timespans.ToList();
    while (timespansList.Count > 0)
    {
        TimeSpan min = timespansList.Min();
        var closeList = timespansList.Where(t => t - min <= GapSize).ToList();
        yield return closeList;
        foreach (var timeSpan in closeList)
        {
            timespansList.Remove(timeSpan);
        }
    }
}

您可能还想在返回之前订购结果(它们在每个组中保留原始排序;组从最低到最高)。如果性能是一个问题,那么编写代码肯定会有更有效的方法,但这将完成工作!