linq - 分组为连续整数范围

标签 linq group-by integer range

我检查了其他帖子,包括 Group by variable integer range using Linq

但我还没有发现任何与我的问题相似的东西......我试图将整数序列不连续的整数范围分组。例如,如果我有一组从 1 到 100 的连续整数,然后我的集合跳过 101,我想创建一个记录,从记录 #1 和 #100 获取日期,其中记录 #1 的日期是开始日期,#100 是结束日期。

每个连续整数范围都会创建一个新记录以添加到记录列表中,这些记录指示范围开始和结束的日期。如果范围仅包含一个整数值(例如,整数范围从 1-100、102 和 104-200),则单个整数范围将具有相同的开始和结束日期。

有什么建议吗?

最佳答案

您可以创建一个扩展方法来执行此操作:

static class EnumerableIntExtensions {
    public static IEnumerable<IEnumerable<T>> ToContiguousSequences<T>(
        this IEnumerable<T> sequence,
        Func<T, T> next
    ) {
        Contract.Requires(sequence != null);
        Contract.Requires(next != null);
        var e = sequence.GetEnumerator();
        if (!e.MoveNext()) {
            throw new InvalidOperationException("Sequence is empty.");
        }
        var currentList = new List<T> { e.Current };
        while (e.MoveNext()) {
            T current = e.Current;
            if (current.Equals(next(currentList.Last()))) {
                currentList.Add(current);
            }
            else {
                yield return currentList;
                currentList = new List<T> { current };
            }
        }
        yield return currentList;
    }
}

用法:

var sequence = Enumerable.Range(1, 100)
                         .Concat(new[] { 102 })
                         .Concat(Enumerable.Range(104, 97));
var sequences = sequence.ToContiguousSequences(n => n + 1);
foreach(var contiguousSequence in sequences) {
    Console.WriteLine(String.Join(", ", contiguousSequence.Select(n => n.ToString())));
}

输出:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
102
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

关于linq - 分组为连续整数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4936876/

相关文章:

c# - 如何在 C# 中使用 where 条件从一个 DataTable 到另一个 DataTable 选择列

c# - 避免 LINQ 中的重复

使用左连接的 MySQL 非常慢的查询

iphone - 很奇怪 - %i 对整数不起作用,%d 对吗?

string - 在 Swift 中重新排序字符串字符

c# - 使用偶尔为空属性的 LINQ SequenceEqual 扩展方法

没有主键的 Linq 插入

sql - 如何仅按月和年分组?

mysql - 谁能帮我找找2005年以前出版的书?

c++ - 找出一组整数的多项式