将对象添加到字典中.但测试部分唯一性
本文关键字:测试部 唯一性 字典 对象 添加 | 更新日期: 2023-09-27 18:35:11
我有以下对象,我想要一个字典来有条件地确定是否存在重复项。 例如,在一个字典中,我只关心我的键的两个属性是唯一的。 在第二个字典中,我希望键的所有属性都是唯一的。
问题1:
我应该覆盖哪些接口才能完成此操作? (例如 GetHashCode、IEqualityComparer、equals operator)
问题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();
}
}
听起来你应该实现IEqualityComparer<EventData>
- 但不是在EventData
本身。创建两个单独的实现 - 一个用于第一个相等概念,另一个用于第二个概念。然后将词典创建为:
var first = new Dictionary<EventData, string>(new PartialDataEqualityComparer());
var second = new Dictionary<EventData, string>(new FullDataEqualityComparer());
或者,也许您想将第二种情况视为EventData
的"自然"相等,在这种情况下,您可以EventData
实现IEquatable<EventData>
,并且在创建第二个字典时不指定比较器。
基本上,您实现IEquatable<T>
说"这种类型的实例能够将自己与T
的实例进行比较",而您实现IEqualityComparer<T>
说"这种类型的实例能够比较任何两个T
实例"。
如果我更改的属性最终会更改键的值,该怎么办?
基本上,你被塞满了。您将无法(或至少可能不会)在字典中再次找到该键。您应该尽可能小心地避免这种情况。就我个人而言,我通常发现作为字典键的良好候选类也是不变性的良好候选者。