1

次のオブジェクトがあり、重複があるかどうかを条件付きで判断する辞書が必要です。たとえば、あるディクショナリでは、2 つのプロパティがキーに対して一意であることだけを気にします。2 番目のディクショナリでは、すべてのプロパティをキーに対して一意にする必要があります。

質問1:

これを実現するには、どのインターフェイスをオーバーライドする必要がありますか? (例: GetHashCode、IEqualityComparer、equals 演算子)

質問2:

最終的にキーの値を変更するプロパティを変更した場合、どうすればよいですか? .NETフレームワークが何らかの形でこれを処理するため、辞書を作成すると、これはおそらくより関連性がありますが、私はそれについて考えたことはありません.

コード

public class EventData : IEqualityComparer<EventData>
{
    public string ComputerName { get; set; }
    public Guid? CategoryName { get; set; }
    public string LogName { get; set; }
    public int EventID { get; set; }
    public long? EventUniqueTracker { get; set; }

    public DateTime LastQueryDate { get; set; }
    public DateTime? DateOfRecord { get; set; }

    //public int QueryCount { get; set; }
    public int QueryCount = 0 ;//

    public string  zData { get; set; }

    public EventData(string computerName, Guid? categoryName, string logName, int eventID, long? eventUniqueTracker, int queryCount)
    {
        ComputerName = computerName;
        CategoryName = categoryName;
        LogName = logName;
        EventID = eventID;
        EventUniqueTracker = eventUniqueTracker;

        LastQueryDate = DateTime.Now;
        QueryCount = queryCount;
    }

    public EventData()
    {
    }

    public override int GetHashCode()
    {
        return GetHashCode(HashType.ZCompCatLogEventAllData);
    }
    public object GetString(HashType hType)
    {
        switch (hType)
        {
            case HashType.AComputerName:
                return ComputerName;
                break;
            case HashType.BCompAndCat:
                return new { A = ComputerName, B = CategoryName };
                break;
            case HashType.CCompCatLog:
                return new { A = ComputerName, B = CategoryName, C = LogName };
                break;
            case HashType.DCompCatLogEvent:
                return new { A = ComputerName, B = CategoryName, C = LogName, D = EventID };
                break;
            case HashType.ECompCatLogEventUserDefined1:
            case HashType.FCompCatLogEventUserDefined2:
            case HashType.ZCompCatLogEventAllData:
                return new { A = ComputerName, B = CategoryName, C = LogName, D = EventID, E = EventUniqueTracker };
            default:
                break;
        }
        return new object { };
    }

    public int GetHashCode(HashType hType)
    {
        return GetString(hType).GetHashCode();
        return 1;
    }

    public override string ToString()
    {
        return ComputerName + " " + CategoryName + " " + LogName + " " + EventID + " " + EventUniqueTracker;
    }

    public bool Equals(EventData x, EventData y)
    {
        return x.ComputerName == y.ComputerName &&
               x.CategoryName == y.CategoryName &&
               x.LogName == y.LogName &&
               x.EventID == y.EventID &&
               x.EventUniqueTracker == y.EventUniqueTracker;
    }

    public int GetHashCode(EventData obj)
    {
        EventData ci = (EventData)obj;
        // http://stackoverflow.com/a/263416/328397
        return new { A = ci.ComputerName, B = ci.CategoryName, C = ci.LogName, D = ci.EventID, E = ci.EventUniqueTracker }.GetHashCode();
    }
}
4

1 に答える 1

2

実装する必要があるように思えますが、それ自体ではありIEqualityComparer<EventData>ませEventData。2 つの別個の実装を作成します。1 つは平等の最初の概念用で、もう 1 つは 2 番目の概念用です。次に、辞書を次のように作成します。

var first = new Dictionary<EventData, string>(new PartialDataEqualityComparer());
var second = new Dictionary<EventData, string>(new FullDataEqualityComparer());

または、2 番目のケースを の「自然な」等価として扱いたい場合、2 番目の辞書を作成するときに比較子を指定せずに実装EventDataすることができます。EventDataIEquatable<EventData>

基本的に、IEquatable<T>「このタイプのインスタンスは、それ自体を のインスタンスと比較できるT」と実装するのに対し、「IEqualityComparer<T>このタイプのインスタンスは、」の任意の 2 つのインスタンスを比較できると実装しますT

最終的にキーの値を変更するプロパティを変更した場合、どうすればよいですか?

基本的に、あなたは詰め物をしています。辞書でそのキーを再び見つけることはできません (または少なくともおそらくできないでしょう)。できる限り慎重にこれを避ける必要があります。個人的には、ディクショナリ キーの良い候補であるクラスは、不変性の良い候補でもあることがよくわかります。

于 2012-05-22T19:39:03.847 に答える