有没有办法将拆分部分分配到struct?
我有字符串显示时间:
10:25, 10:55
11:05, 11:50
12:20, 13:10
我正在从文本文件中迭代这些行,并希望分配给ParkTime struct
public struct ParkTime
{
public string startTime { get; set; }
public string endTime { get; set; }
}
我尝试使用LINQ,但首先我需要使用正则表达式验证行。
答案 0 :(得分:1)
我建议在你的struct中使用DateTime(或者更好的类,但这在这里并不重要)。通过这种方式,输入的验证更加集中于预期值,您可以避免使用正则表达式
List<ParkTime> parktimes = new List<ParkTime>();
foreach (string line in File.ReadLines("file.txt"))
{
bool isValid = true;
string[] times = line.Split(',');
DateTime dtInit;
if(!DateTime.TryParseExact(times[0].Trim(), "HH:mm",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.NoCurrentDateDefault,
out dtInit))
isValid = false;
DateTime dtEnd;
if (!DateTime.TryParseExact(times[1].Trim(), "HH:mm",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.NoCurrentDateDefault,
out dtEnd))
isValid = false;
if (isValid)
parktimes.Add(new ParkTime() { startTime = dtInit, endTime = dtEnd });
}
public struct ParkTime
{
public DateTime startTime { get; set; }
public DateTime endTime { get; set; }
}
关于使用类或结构来建模数据,来自E.Lippert的this is a classical answer(C#语言的主要开发人员)
答案 1 :(得分:0)
您可以使用Linq Where
仅选择有效行,然后使用Select
来创建结构。
lines
.Where(line => validate(line))
.Select(line => new ParkTime() {startTime = getStartTime(line), endTime = getEndTime(line));
以下是使用的方法及其签名:
public bool validate(string line){
return true; //validate if the line is correct
}
public string getStartTime(string line){
return null; //select the start time from the line
}
public string getEndTime(string line){
return null; //select the end time from the line
}
答案 2 :(得分:0)
对于这样的任务,我使用一个简单的TimeSlot结构,它包含 timespan 而不是结束时间。有些操作更容易或更直接,但当然,这取决于您计划停车时间的使用情况。
public struct TimeSlot
{
private DateTime _start;
private TimeSpan _span;
public DateTime Start
{
get
{
if (_start == null)
{
_start = DateTime.Today;
}
return _start;
}
set
{
_start = value;
}
}
public TimeSpan Span
{
get
{
if (_span == null)
{
_span = new TimeSpan(0);
}
return _span;
}
set
{
if (value.Ticks >= 0)
{
_span = value;
}
}
}
public DateTime End
{
get
{
return Start.Add(Span);
}
}
public TimeSlot(DateTime start, TimeSpan span)
{
_start = start;
_span = span.Ticks >= 0 ? span : new TimeSpan(0);
}
}
答案 3 :(得分:0)
如果你知道如何迭代你的线,你只需要拆分每一行,然后将修剪后的值分配给属性。
ParkTime pt = new ParkTime();
string[] arr = "10:25, 10:55".Split(",");
pt.startTime = arr[0].Trim();
pt.endTime = arr[1].Trim();