1

たとえば、従業員の存在を表す 2 つの DateTime のセットを意味するタイムブロックを処理したいと考えています。特定の時間の前後にブロックを検索するために使用できる構造は既にありますか? 開始と終了に 2 つの DateTime を使用したり、開始と TimeSpan に Datetime を使用したりするなど、状況を表現する方法はたくさんあります。しかし、私はそれらをある種のコレクションで扱いたいと思っています。それで、私が使用できる類似のものはありますか、それとも完全に自分で実装する必要がありますか?

ありがとう

4

6 に答える 6

2

このライブラリは素晴らしいものです - インスピレーションを得られますように

.NET の期間ライブラリ

于 2012-08-24T12:28:10.540 に答える
1

クラス:

public class TimePeriod
{
    public DateTime Oldest { get; set; }
    public DateTime Newest { get; set; }

    public TimePeriod(DateTime oldest, DateTime newest)
    {
        Oldest = oldest;
        Newest = newest;
    }

    public bool Contains (DateTime time)
    {
        return Oldest.CompareTo(time) <= 0 && Newest.CompareTo(time) >= 0;
    }

    public bool IsAfter(DateTime time)
    {
        return Newest.CompareTo(time) <= 0;
    }

    public bool IsBefore(DateTime time)
    {
        return Oldest.CompareTo(time) >= 0; 
    }
}

テスト:

class Program
{
    static void Main(string[] args)
    {
        var period = new TimePeriod(
                    DateTime.Now.AddDays(-2),
                    DateTime.Now.AddDays(1));

        var date = DateTime.Now;
        var contains = period.Contains(date); // true
        var isBefore = period.IsBefore(date); // false
        var isAfter = period.IsAfter(date);   // false

        date = DateTime.Now.AddDays(-10);
        contains = period.Contains(date); // false
        isBefore = period.IsBefore(date); // true
        isAfter = period.IsAfter(date);   // false

        date = DateTime.Now.AddDays(10);
        contains = period.Contains(date); // false
        isBefore = period.IsBefore(date); // false
        isAfter = period.IsAfter(date);   // true
    }
}

コレクションと linq を拡張メソッドとラムダ式で使用して、時間ブロックを探すことができるようになりました。

于 2012-08-24T12:36:06.483 に答える
0

助けてくれてありがとう!TimePeriod ライブラリを詳しく調べて、Linq を使って実験を行います。私はすでにバイナリ検索を実装するアプローチを持っているので、興味のある人は私に連絡してください;)

于 2012-08-25T11:29:30.253 に答える
0

これは組み込みではありません。これを自分で実装したい場合は、おそらくstructを作成したいと思うでしょう。これにより、値型のコピー セマンティクスが得られます。intこのような値は、またはなどの組み込み型と同じように動作しますDateTime。非常に直感的に使用できます。

于 2012-08-24T12:16:27.000 に答える
0

DateSpan以前は構造体を使用していました。好きなだけ拡張できますが、これが出発点になります。

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace StackOverFlowDateSpan
{
[StructLayout(LayoutKind.Auto)]
[Serializable]
public struct DateSpan : IComparable, IComparable<DateSpan>, IEquatable<DateSpan>
{
    public DateSpan(DateTime start, DateTime end)
        : this()
    {
        Start = start;
        End = end;
    }

    #region Properties

    public TimeSpan Duration
    {
        get { return TimeSpan.FromTicks((End - Start).Ticks); }
    }

    public DateTime End { get; private set; }
    public DateTime Start { get; private set; }

    #endregion

    public int CompareTo(DateSpan other)
    {
        long otherTicks = other.Duration.Ticks;
        long internalTicks = Duration.Ticks;

        return internalTicks > otherTicks ? 1 : (internalTicks < otherTicks ? -1 : 0);
    }

    public bool Equals(DateSpan other)
    {
        return End.Equals(other.End) && Start.Equals(other.Start);
    }

    public int CompareTo(object other)
    {
        if (other == null)
        {
            return 1;
        }

        if (!(other is DateSpan))
        {
            throw new ArgumentNullException("other");
        }

        return CompareTo((DateSpan)other);
    }

    public override bool Equals(object other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }
        return other is DateSpan && Equals((DateSpan)other);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return (End.GetHashCode() * 397) ^ Start.GetHashCode();
        }
    }

    public static bool operator ==(DateSpan left, DateSpan right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(DateSpan left, DateSpan right)
    {
        return !left.Equals(right);
    }

    private sealed class EndStartEqualityComparer : IEqualityComparer<DateSpan>
    {
        #region IEqualityComparer<DateSpan> Members

        public bool Equals(DateSpan x, DateSpan y)
        {
            return x.End.Equals(y.End) && x.Start.Equals(y.Start);
        }

        public int GetHashCode(DateSpan obj)
        {
            unchecked
            {
                return (obj.End.GetHashCode() * 397) ^ obj.Start.GetHashCode();
            }
        }

        #endregion
    }

    private static readonly IEqualityComparer<DateSpan> _endStartComparerInstance = new EndStartEqualityComparer();

    public static IEqualityComparer<DateSpan> EndStartComparer
    {
        get { return _endStartComparerInstance; }
    }
}
}
于 2012-08-24T12:35:12.133 に答える
0

TimeSpan をご覧ください。それは「タイムブロック」を処理する構造体です

于 2012-08-24T12:30:57.823 に答える