将字符串拆分为struct

时间:2015-12-06 13:13:05

标签: c# string struct

有没有办法将拆分部分分配到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,但首先我需要使用正则表达式验证行。

4 个答案:

答案 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();