14

null 許容の datetime オブジェクトが 2 つあります。両方を比較したいと思います。それを行う最良の方法は何ですか?

私はすでに試しました:

DateTime.Compare(birthDate, hireDate);

これはエラーを引き起こしています。おそらく、タイプの日付が必要でSystem.DateTimeあり、Nullable の日時があります。

私も試しました:

birthDate > hiredate...

しかし、結果は期待どおりではありません...何か提案はありますか?

4

8 に答える 8

24

Nullable<T>2 つのオブジェクトを比較するにはNullable.Compare<T>、次のように使用します。

bool result = Nullable.Compare(birthDate, hireDate) > 0;

次のこともできます。

Nullable DateTime の Value プロパティを使用します。(両方のオブジェクトに値があるかどうかを確認してください)

if ((birthDate.HasValue && hireDate.HasValue) 
    && DateTime.Compare(birthDate.Value, hireDate.Value) > 0)
{
}

両方の値が同じ DateTime.Compare の場合、あなたが返されます0

何かのようなもの

DateTime? birthDate = new DateTime(2000, 1, 1);
DateTime? hireDate = new DateTime(2013, 1, 1);
if ((birthDate.HasValue && hireDate.HasValue) 
    && DateTime.Compare(birthDate.Value, hireDate.Value) > 0)
{
}
于 2013-01-10T06:19:50.070 に答える
12

Nullable.Equals指定された 2 つの Nullable(Of T) オブジェクトが等しいかどうかを示します。

試す:

if(birthDate.Equals(hireDate))

最良の方法は次のとおりです。Nullable.Compare メソッド

Nullable.Compare(birthDate, hireDate));
于 2013-01-10T06:20:45.533 に答える
4

null値を次のように処理する場合default(DateTime)は、次のようにします。

public class NullableDateTimeComparer : IComparer<DateTime?>
{
    public int Compare(DateTime? x, DateTime? y)
    {
        return x.GetValueOrDefault().CompareTo(y.GetValueOrDefault());
    }
}

そして、このように使用します

var myComparer = new NullableDateTimeComparer();
myComparer.Compare(left, right);

これを行う別の方法はNullable、値が比較可能な型の拡張メソッドを作成することです

public static class NullableComparableExtensions
{
    public static int CompareTo<T>(this T? left, T? right)
        where T : struct, IComparable<T>
    {
        return left.GetValueOrDefault().CompareTo(right.GetValueOrDefault());
    }
}

このように使用する場所

DateTime? left = null, right = DateTime.Now;
left.CompareTo(right);
于 2013-01-10T06:23:27.270 に答える
4

メソッドを使用しNullable.Compare<T>ます。このような:

var equal = Nullable.Compare<DateTime>(birthDate, hireDate);
于 2013-09-09T08:48:46.410 に答える
1

試す

birthDate.Equals(hireDate)

比較後に自分のことをします。

または、使用

object.equals(birthDate,hireDate)
于 2013-01-10T06:27:02.780 に答える
1

@Vishal が述べたように、単純にオーバーライドされたEqualsメソッドを使用しますNullable<T>。次のように実装されます。

public override bool Equals(object other)
{
    if (!this.HasValue)    
        return (other == null);

    if (other == null)    
        return false;

    return this.value.Equals(other);
}

true両方の null 許容構造体に値がない場合、またはそれらの値が等しい場合に戻ります。だから、単に使用する

birthDate.Equals(hireDate)
于 2013-01-10T06:25:30.113 に答える
1

次のように条件を使用できると思います

birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)
于 2013-01-10T06:31:41.477 に答える
0

以下のような任意のタイプの Min または Max を計算する汎用メソッドを作成できます。

public static T Max<T>(T FirstArgument, T SecondArgument) {
    if (Comparer<T>.Default.Compare(FirstArgument, SecondArgument) > 0)
        return FirstArgument;
    return SecondArgument;
}

次に、以下のように使用します。

var result = new[]{datetime1, datetime2, datetime3}.Max();
于 2015-11-19T08:41:12.027 に答える