2

私はDictionary<DateTime, int>このように定義しています:

public Dictionary<DateTime, int> Days;

それぞれDateTimeがに関連付けられていintます。DateTime辞書に同じ日のがすでにあるかどうかを示す関数が欲しいのですが:

public int GetIntFromDate(DateTime date)
{
    int i = -1;
    if (Days.ContainsKey(date))
    {
        i= CorrespondanceJoursMatchs[date];
    }

    return i;
}

これは完璧ですが、同じ日+月+年(時間/分/秒を見ずに)のがすでにある場合は、ContainsKey返品を希望します。trueDateTime

実際、私の辞書ではDateTime、同じ日/月/年の2つのインデックスを許可するべきではありません。

DateTime解決策は、属性とオーバーライドGetHashCodeとを使用してクラスを作成することEqualsですが、もっと良い解決策があるのではないでしょうか。

4

1 に答える 1

15

簡単です。IEqualityComparer<DateTime>を使用する方法でDateTime.Date実装し、その実装のインスタンスをDictionary<,>コンストラクターに渡します。サンプルコード:

using System;
using System.Collections.Generic;

class DateEqualityComparer : IEqualityComparer<DateTime>
{
    public bool Equals(DateTime x, DateTime y)
    {
        return x.Date == y.Date;
    }

    public int GetHashCode(DateTime obj)
    {
        return obj.Date.GetHashCode();
    }
}

class Test
{
    static void Main()
    {
        var key1 = new DateTime(2013, 2, 19, 5, 13, 10);
        var key2 = new DateTime(2013, 2, 19, 21, 23, 30);

        var comparer = new DateEqualityComparer();
        var dictionary = new Dictionary<DateTime, string>(comparer);
        dictionary[key1] = "Foo";
        Console.WriteLine(dictionary[key2]); // Prints Foo
    }

}
于 2013-02-19T21:21:39.577 に答える