Skip to main content
 首页 » 编程设计

c#之从日期集合中查找日期范围 C#

2024年02月03日30虾米姐

简单的问题。我有一个有序的日期集合。顺便说一下,它们是英国日期

01/01/10 
01/02/10 
01/03/10 
01/04/10 
02/04/10 
03/04/10 
04/04/10 

我想将其转换为日期范围的集合

01/01/10 -> 01/01/10 
01/02/10 -> 01/02/10 
01/03/10 -> 01/03/10 
01/04/10 -> 04/04/10 

澄清一下,我正在尝试将任何连续日期转换为一个范围。所以前 3 个日期是独立的,后 4 个日期转换为 4 月 1 日到 4 月 4 日的范围。

现在我可以使用循环来做到这一点,但它不是很优雅。有没有人有任何解决方案?

谢谢

请您参考如下方法:

鉴于您想确定连续日期范围的范围,我认为您唯一的选择是,正如您所说的循环。不过,您可以一次性完成,并将其放入扩展方法中,以便它可以在任何 IList<DateTime> 上运行。 ,例如:

// purely an example, chances are this will have actual, y'know logic in live 
public class DateRange 
{ 
    private List<DateTime> dates = new List<DateTime>(); 
 
    public void Add(DateTime date) 
    { 
        this.dates.Add(date); 
    } 
 
    public IEnumerable<DateTime> Dates 
    { 
        get { return this.dates; } 
    } 
} 
 
public static IEnumerable<DateRange> GetRanges(this IList<DateTime> dates) 
{ 
    List<DateRange> ranges = new List<DateRange>(); 
    DateRange currentRange = null; 
 
    // this presumes a list of dates ordered by day, if not then the list will need sorting first 
    for( int i = 0; i < dates.Count; ++i ) 
    { 
        var currentDate = dates[i]; 
        if( i == 0 || dates[i - 1] != currentDate.AddDays(-1)) 
        { 
            // it's either the first date or the current date isn't consecutive to the previous so a new range is needed 
            currentRange = new DateRange(); 
            ranges.Add(currentRange); 
        } 
 
        currentRange.Add(currentDate); 
    } 
 
    return ranges; 
} 

您还可以通过传入 IEnumerable<DateTime> 使其更加通用:

public static IEnumerable<DateRange> GetRanges(this IEnumerable<DateTime> dates) 
{ 
    List<DateRange> ranges = new List<DateRange>(); 
    DateRange currentRange = null; 
    DateTime? previousDate = null; 
 
    // this presumes a list of dates ordered by day, if not then the list will need sorting first 
    foreach( var currentDate in dates ) 
    { 
        if( previousDate == null || previousDate.Value != currentDate.AddDays(-1) ) 
        { 
            // it's either the first date or the current date isn't consecutive to the previous so a new range is needed 
            currentRange = new DateRange(); 
            ranges.Add(currentRange); 
        } 
 
        currentRange.Add(currentDate); 
        previousDate = currentDate; 
    } 
 
    return ranges; 
}