public IDictionary <DayType, ICollection <DatesRange> > GetRanges(Month month) { var groups = month.Days.Where(d => d.Number > 0).OrderBy(d => d.Number).GroupBy(d => d.Type).ToDictionary(d => d.Key, d => d.Select(g => g.Number).ToList()); var result = new Dictionary <DayType, ICollection <DatesRange> >(); foreach (var group in groups) { var dayType = group.Key; if (!result.ContainsKey(dayType)) { result.Add(dayType, new List <DatesRange>()); } var groupDays = group.Value; var ranges = new List <List <int> >(); var currentRange = new List <int>(); ranges.Add(currentRange); void createNewCurrentRange() { currentRange = new List <int>(); ranges.Add(currentRange); } for (var i = 0; i < groupDays.Count(); i++) { var day = groupDays[i]; var nextDayIndex = i + 1; if (i > 0) { var previousDay = groupDays[i - 1]; if (day - previousDay > 1) { createNewCurrentRange(); } } if (nextDayIndex >= groupDays.Count()) { currentRange.Add(day); //createNewCurrentRange(); continue; } var nextDay = groupDays[nextDayIndex]; if (nextDay - day == 1) { currentRange.AddRange(new[] { day, nextDay }); i++; } else { currentRange.Add(day); createNewCurrentRange(); } } foreach (var range in ranges) { if (!range.Any()) { continue; } var minDateNumber = range.Min(); var maxDateNumber = range.Max(); var minDate = new DateTime(month.Year, month.Number, minDateNumber); var maxDate = new DateTime(month.Year, month.Number, maxDateNumber); var datesRange = new DatesRange(minDate, maxDate); result[dayType].Add(datesRange); } } return(result); }
/// <summary> /// Export data using BackgroundWorker. Build series table and pass parameters from here to BackgroundWorker. /// </summary> private void btnExport_Click(object sender, EventArgs e) { // Make sure we aren't still working on a previous task if (bgwMain.IsBusy) { MessageBox.Show("The background worker is busy now. Please try later.", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check the themes for export. There should be at least one item selected. if (ExportThemes && clbThemes.CheckedItems.Count == 0) { MessageBox.Show("Please choose at least one theme to export", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check the desired fields for export. There should be at least one item selected. if (clbExportItems.CheckedItems.Count == 0) { MessageBox.Show("Please choose at least one field to export", "Export To Text File", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //Check whether a delimiter is checked var delimiter = delimiterSelector1.CurrentDelimiter; if (String.IsNullOrEmpty(delimiter)) { MessageBox.Show("Please input delimiter.", "Export To Text File"); return; } //Check the output file path string outputFilename = tbOutPutFileName.Text.Trim(); if (outputFilename == String.Empty) { MessageBox.Show("Please specify output filename", "Export To Text File"); return; } if (Directory.Exists(Path.GetDirectoryName(outputFilename)) == false) { MessageBox.Show("The directory for the output filename does not exist", "Export To Text File"); return; } // Construct DataTable of all the series in the selected theme DataTable dtSeries; if (ExportThemes) { var themeIds = (from ThemeDescription themeDescr in clbThemes.CheckedItems select themeDescr.ThemeId).ToList(); var repository = RepositoryFactory.Instance.Get <IDataSeriesRepository>(); dtSeries = repository.GetSeriesIDsWithNoDataValueTable(themeIds); } else { dtSeries = _dataToExport; } var checkedItems = new List <string>(); foreach (var item in clbExportItems.CheckedItems.Cast <string>().Where(item => !checkedItems.Contains(item))) { checkedItems.Add(item); } DatesRange datesRange = null; if (chbUseDateRange.Checked && cmbDateTimeColumns.SelectedIndex >= 0) { datesRange = new DatesRange { ColumnName = cmbDateTimeColumns.SelectedItem.ToString(), StartDate = dtpStartDateRange.Value, EndDate = dtpEndDateRange.Value, }; } //Disable all the buttons after "Export" button is clicked. UpdateControlsState(true); // Show hourglass Cursor = Cursors.WaitCursor; //pass parameters to BackgroundWorker var parameters = new BwParameters { CheckNoData = chkNodata.Checked, Columns = checkedItems, DatesRange = datesRange, Delimiter = delimiter, OutputFileName = outputFilename, Series = dtSeries, }; // Check for overwrite if (File.Exists(outputFilename)) { var message = "File " + outputFilename + " already exists.\nWould you like to replace it?"; var replace = MessageBox.Show(message, "Export To Text File", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (replace == DialogResult.No) { Cursor = Cursors.Default; // Restore controls to their regular state UpdateControlsState(false); return; } File.Delete(outputFilename); bgwMain.RunWorkerAsync(parameters); } else { bgwMain.RunWorkerAsync(parameters); } }