我在列表中有以下值:
[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.的答案对我有用。感谢。
答案 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);
}
}
}
您可能还想在返回之前订购结果(它们在每个组中保留原始排序;组从最低到最高)。如果性能是一个问题,那么编写代码肯定会有更有效的方法,但这将完成工作!