C# 按x秒范围内的值对时间跨度列表进行分组

C# 按x秒范围内的值对时间跨度列表进行分组,c#,linq,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

我在列表中有以下值:

[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
现在我想用下面的方法对这些值进行分组。 第一组:

及 第2组:

这样我可以在以后构建avarage并获得:-14.826-0.11

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

编辑: 列表中的值是随机的。这意味着预先定义组不会起作用。我扩展了示例列表


EDIT2:蒂姆·S.的答案对我来说很有用。谢谢。

您可以通过一个简单的
while
循环和一些LINQ来实现这一点。我还使用它使代码可读

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);
        }
    }
}
private static readonly TimeSpan GapSize=TimeSpan.FromSeconds(3);
公共静态IEnumerable GetGroups(IEnumerable timespans)
{
var timespansList=timespans.ToList();
同时(timespansList.Count>0)
{
TimeSpan min=timespansList.min();

var closeList=timespansList.Where(t=>t-min
timeSpans.GroupBy(t=>(int)t.TotalSeconds/3)
我认为这只适用于那些范围在0>=3,3>=6,6>=9之间的组……但我希望这些组取决于列表中的实际值
[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
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);
        }
    }
}