在C#中枚举类属性

时间:2010-03-26 01:02:55

标签: c# linq silverlight reflection

我有一个与此类似的课程

 public class Model
{
    public TimeSpan Time1 {get; set;}
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

}

现在让我们想象一下,我必须在运行时填充时间,然后计算出时间1和时间2之间的剩余时间,然后当通过时查找时间2和时间3之间剩余的时间,依此类推。但是,我需要考虑现在的时间。

例如:

现在是下午1点

时间1 =早上5:00 时间2 =中午12:00 时间3 =下午4:00 时间4 =下午6:00

因此,由于时间是下午1:00,我需要找到时间2和时间3之间的差异

现在除了反思之外还有更聪明的方法来确定这个吗?我应该在课堂上添加一些东西

6 个答案:

答案 0 :(得分:7)

如果您需要保留类的现有结构,可以添加一个方法来枚举时间:

public class Model
{
    public TimeSpan Time1 {get; set;}
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

    public IEnumerable<TimeSpan> GetTimes()
    {
        yield return Time1;
        yield return Time2;
        yield return Time3;
        yield return Time4;
    }
}

并像这样使用它:

foreach (TimeSpan time in model.GetTimes())
{
    // use the TimeSpan
}

答案 1 :(得分:3)

为什么不使用数组或列表?

public class Model
{
    public List<DateTime> Dates { get; set; }
}

答案 2 :(得分:1)

如果我正确理解了您的问题,为什么不能使用Dictionary<TimeSpan, string>,其中密钥为实际TimeSpan,并且值为名称,例如"Time1"?这样,您可以对键进行排序,找到所需的对,然后获取其名称。

答案 3 :(得分:0)

您可以添加一个属性或方法,将时间作为列表返回,以便于处理。然后,您的外部代码可以作为列表或单个属性访问时间。您仍然必须显式访问每个属性,但至少它来自同一个类,因此您不会将外部代码与数据结构紧密耦合。

答案 4 :(得分:0)

这是未经测试的,需要一些优化,但作为一个思考示例,使用数组并迭代它。

public class Model
{
    private TimeSpan[] _timeSpans = new TimeSpan[4] { new TimeSpan(), new TimeSpan(), new TimeSpan(), new TimeSpan() };

    public TimeSpan Time1
    {
        get { return _timeSpans[0]; }
        set { _timeSpans[0] = value; }
    }
    public TimeSpan Time2
    {
        get { return _timeSpans[1]; }
        set { _timeSpans[1] = value; }
    }
    public TimeSpan Time3
    {
        get { return _timeSpans[2]; }
        set { _timeSpans[2] = value; }
    }
    public TimeSpan Time4
    {
        get { return _timeSpans[3]; }
        set { _timeSpans[3] = value; }
    }

    // DateTime.TimeOfDay holds the time portion of a time
    public TimeSpan GetDifference(TimeSpan currentTime)
    {
        int start = -1;
        for(int i = 0; i<_timeSpans.Length;i++)
        {
            if(_timeSpans[i] >= currentTime)
            {
                start = i;
                break;
            }
        }
        if(start == -1) throw new ArgumentException("handle the case where currentTime is smaller than all of them");
        int end = (start + 1 < _timeSpans.Length) ? start + 1 : 0;
        return _timeSpans[end] - _timeSpans[start];
    }

答案 5 :(得分:0)

构造数组提供了一个简单的linq语句来计算时间跨度:

public class Model
{
    public TimeSpan Time1 { get; set; }
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

    public TimeSpan GetSpan(TimeSpan time)
    {
        var times = new[] { Time1, Time2, Time3, Time4 };

        return Enumerable.Range(1, times.Length - 1)
            .Select(i => new[] { times[i - 1], times[i] })
            .Where(t => t[0] <= time && time < t[1])
            .Select(t => t[1] - t[0])
            .FirstOrDefault();
    }
}