Есть ли способ выполнить 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
по отдельности и не сделать expectedResult.Add(new Tuple<DateTime, DateTime>(DateTime.Parse(timeTuple.Item1), DateTime.Parse(timeTuple.Item2)));
Неясно, какие входные данные получает ваше определение шага, поэтому трудно рекомендовать исправление. Можете ли вы отредактировать свой вопрос, чтобы включить шаг из файла функций?
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();
Нет, в качестве параметра требуется строка для анализа. Если вы можете написать это, что мешает вам передать
DateTime.Parse
строковые аргументы из вашегоtimeTuple
экземпляра, а затем назначить результаты экземпляру(DateTime, DateTime)
кортежа?