Как сортировать и выводить данные, хранящиеся в списке

1

У меня есть приложение, которое читает текстовый файл с датами.

Обратите внимание, что я все еще изучаю С#

содержимое в текстовом файле выглядит примерно так: т.е. я не был отсортирован, но я уже сохранил их в списке и отсортировал по порядку ASC.

02/10/1998
03/10/1998
07/10/1998
10/10/1998
17/10/1998
20/10/1998

Текстовый файл имеет более ста дат, из-за того, что я пользуюсь телефоном, я не могу напечатать весь текст и не могу написать весь код.

в основном цель приложения - записать в новый текстовый файл, содержимое с ** недельными блоками из периода времени, то есть:

Week : Sunday 27 1998 to Saturday 03 1998
Friday 02 1998
Fri 2 98
02/10/98
Saturday 03 1998
Sat 2 98
03/10/1998
Week : Sunday 04 1998 to Saturday 10 1998
Wednesday 07 1998
Wed 7 98
07/10/1998
Saturday 10 1998
Sat 10 98
10/10/1998

//And so on till last date

Выход должен начинаться с первого воскресенья до субботы и заканчиваться последним воскресеньем по субботу.

Все, что мне нужно знать, - как генерировать такой вывод по недельным блокам из разницы?

Я уже написал код для сортировки из списка, и теперь я думаю, что мне приходится разбирать форматы даты

var sortedlist = stulist.OrderBy(s => s.DOB);

DateTime dt = DateTime.ParseExact(line, "ddddMMMMdd", CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(line, "dddMMMd", CultureInfo.InvariantCulture);
DateTime dt3 = DateTime.ParseExact(line, "MM/dd/yyyy", CultureInfo.InvariantCulture);

Я думаю, что мне нужно зацикливаться, но я не могу понять, что указать в моем цикле while.

Любая помощь будет высоко оценена

Какая разница:

tx.WriteLine(dt.ToString("dddd dd yyyy", CultureInfo.InvariantCulture));

есть, если я сохраню ParseExact?

tx.WriteLine(dt);
  • 1
    Вы должны отредактировать свой вопрос и уточнить, что вы действительно хотите знать, как получить эти недельные блоки из временного интервала. В настоящее время неясно, является ли это или формат datetime основой вашего вопроса.
  • 0
    @TimSchmelter спасибо, что сообщили мне, я отредактировал.
Показать ещё 2 комментария
Теги:
linq
loops
sorting
timespan

2 ответа

2
Лучший ответ

Ваш вопрос немного запутан. Я пытаюсь повторить то, что вы, вероятно, делаете. Кажется, у вас есть Student класс, у которого (среди других) поле DOB. Я предполагаю, что он имеет тип DateTime. Тогда вы должны сделать что-то вроде этого, чтобы прочитать текстовый файл:

var students = new List<Student>();
string[] lines = File.ReadAllLines("my file path");
CultureInfo southAfricanCuture = new CultureInfo("en-ZA");
foreach (string l in lines) {
    DateTime d;
    if (DateTime.TryParseExact(l, "dd/MM/yyyy", southAfricanCuture,
                               DateTimeStyles.AllowWhiteSpaces, out d))
    {
        students.Add(new Student { DOB = d });
    }
}

Мы должны использовать TryParseExact, чтобы иметь правильный порядок дня и месяца. Но, возможно, я использую неправильную культуру.

Т.е. разбор происходит при преобразовании даты, указанной в тексте, в DateTime. Чтобы уточнить даты, позже вам придется преобразовать их обратно в string, форматируя их (не Parsing!).

Чтобы продолжить, нам понадобится этот вспомогательный метод:

public static DateTime FirstDateOfWeek(DateTime date)
{
    // Since Sunday = 0 and we want sunday to be the first day of week:
    int dayOfWeek = (int)date.DayOfWeek;
    return date.AddDays(-dayOfWeek);
}

Теперь давайте создадим блоки даты с помощью LINQ (убедитесь, что вы using System.Linq; в начале вашего кода):

var dtfi = DateTimeFormatInfo.InvariantInfo;
Calendar cal = dtfi.Calendar;

var dateBlocks = students
    .Select(s => s.DOB)
    .GroupBy(d => 100 * d.Year +
                  cal.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Sunday))
    .OrderBy(g => g.First()); // Order the groups by first date found in them.

И теперь давайте создадим вывод:

foreach (var block in dateBlocks) {
    // Week header
    DateTime firstDayOfWeek = FirstDateOfWeek(block.First());
    DateTime lastDayOfWeek = firstDayOfWeek.AddDays(6);
    string weekHeader = String.Format(southAfricanCuture,
        "Week : {0:dddd dd/MM yyyy} to {1:dddd dd/MM yyyy}",
        firstDayOfWeek, lastDayOfWeek);
    Console.WriteLine(weekHeader);

    // Week details.
    // If the dates appear in wrong order in the input file,
    // order the days within the groups.
    foreach (DateTime date in block.OrderBy(d => d)) {
        Console.WriteLine(date.ToString("    dddd dd/MM yyyy", southAfricanCuture));
        Console.WriteLine(date.ToString("    ddd d/M yy", southAfricanCuture));
        Console.WriteLine(date.ToString("    dd/MM/yy", southAfricanCuture));
    }
}
Console.ReadKey();

Как вы можете видеть, работа с датами - сложный вопрос.

  • 0
    Спасибо, это то, что я искал, поэтому в основном я должен использовать date.ToString для моих выводов
1

В этом вопросе есть тег linq. Я пытался сделать это в linq

Создать список со значениями

    var lst = new List<string> {"02/10/1998",
    "03/10/1998",
    "07/10/1998",
    "10/10/1998",
    "17/10/1998",
    "20/10/1998"
    };

Список значений даты и времени

var DateList = (from value in lst
                   select DateTime.ParseExact(value, "dd/MM/yyyy",
                       CultureInfo.InvariantCulture)).ToList();

Позволяет сделать наш список более удобным для использования

List<MyClass> lst3 = DateList.Select(p => new MyClass
        {
            DT = p,
            WeekOfYear = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(p , DateTimeFormatInfo.CurrentInfo.CalendarWeekRule, DayOfWeek.Monday),
            FirstDayOfWeek = p.AddDays(DayOfWeek.Monday - p.DayOfWeek),
            LastDayOfWeek = p.AddDays(DayOfWeek.Sunday - p.DayOfWeek)
        }).OrderBy(x=>x.WeekOfYear).ToList();

Теперь вы можете показать результат

 int current_week=-1;
        foreach (MyClass o in lst3)
        {
            if (current_week > o.WeekOfYear)
            {
                current_week = o.WeekOfYear;
                Console.WriteLine("Week: {0} {1} to {2} {3}", o.FirstDayOfWeek.DayOfWeek.ToString() ,o.FirstDayOfWeek, o.LastDayOfWeek.DayOfWeek.ToString(), o.LastDayOfWeek);
            }
            Console.WriteLine("{0} {1}", o.DT.DayOfWeek.ToString(), o.DT);
        }
  • 0
    Это должно сработать. Когда я писал этот вопрос, я был новичком, когда речь шла о LINQ.
  • 0
    @ Brian02 Что ты имеешь в виду под этим? Вам поможет этот ответ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню