Выполнение DateTime.Parse для кортежа в C#

Есть ли способ выполнить DateTime.Parse для кортежа в C#.

Я использую Specflow, и часть тестов, которые я выполняю, включает тестирование списка DateTime кортежей (например, List<(DateTime, DateTime)>). На этом этапе я беру строку, анализирую ее в список строк, где каждая строка представляет пару DateTime, разделенную =.

План состоял в том, чтобы создать кортеж для хранения значения путем разделения строки, создания кортежа строки, а затем анализа этого кортежа с помощью DateTime.Parse.

Это не работает, выдавая мне ошибку CS1503 (аргумент n: невозможно преобразовать из «типа x» в «тип y»), и я не могу найти в Интернете никакой другой информации об использовании DateTime.Parse в кортежах. Есть ли другой способ изменить эти значения на DateTime?

Ниже приведен фрагмент моего кода для справки:

public class TimeModeServiceStepDefinitions
{
    List<(DateTime, DateTime)> expectedResult = new List<(DateTime, DateTime)>();

    [Given(@"I have the following list of expected results: '([^']*)'")]
    public void GivenIHaveTheFollowingListOfExpectedResults(string p0)
    {
        List<string> tuples = p0.Split('|').ToList();
        foreach (var tuple in tuples)
        {
            var timeTuple = (first: "first", second: "second");
            timeTuple = tuple.Split('=') switch { var a => (a[0], a[1]) };
            expectedResult.Add(DateTime.Parse(timeTuple));
        }
    }
}

Нет, в качестве параметра требуется строка для анализа. Если вы можете написать это, что мешает вам передать DateTime.Parse строковые аргументы из вашего timeTuple экземпляра, а затем назначить результаты экземпляру (DateTime, DateTime) кортежа?

Igor 15.11.2022 17:24

почему бы просто не разобрать каждый DateTime по отдельности и не сделать expectedResult.Add(new Tuple<DateTime, DateTime>(DateTime.Parse(timeTuple.Item1), DateTime.Parse(timeTuple.Item2)));

frankM_DN 15.11.2022 17:31

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

Greg Burghardt 16.11.2022 15:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

DateTime.Parse принимает строку, которая должна содержать одну дату/время. Итак, мы можем просто написать:

string[] a = tupleString.Split('=');
var timeTuple = (first: DateTime.Parse(a[0]), second: DateTime.Parse(a[1]));

где timeTuple относится к типу (DateTime first, DateTime second).

var timeTuple = (first: "first", second: "second"); — странный способ объявления кортежной переменной. C# имеет синтаксис кортежа не только для значений кортежа, но и для типов кортежа:

(DateTime first, DateTime second) namedTuple;
(DateTime, DateTime) unnamedTuple; // With elements named Item1, Item2

В идеале вы бы просто сопоставили DateTime.Parse кортеж, но я не думаю, что есть способ сделать это как часть стандартной библиотеки. Вы можете легко написать расширение, которое поможет вам написать такой код (Select — это, по сути, имя, выбранное для операции сопоставления в LINQ):

static class TupleExtensions
{
    public static (TResult,TResult) Select<T,TResult>(
        this (T,T) v, Func<T,TResult> f)
          => (f(v.Item1), f(v.Item2));
}

И тогда вы можете написать:

    string p0 = "2022-11-11=2022-12-12";
    List<string> tuples = p0.Split('|').ToList();
    var expectedResult = 
         tuples.Select(tuple => tuple.Split('=') switch { var a => (a[0], a[1]) })
         .Select(x => x.Select(DateTime.Parse))
         .ToList();

Другие вопросы по теме