HashSet与自定义对象相等,并获取一个元素
本文关键字:元素 一个 获取 自定义 对象 HashSet | 更新日期: 2023-09-27 18:23:59
我有以下类和它的HashSet:
public class VersionSettings {
public String Culture { get; set; }
public String Domain { get; set; }
public String Name { get; set; }
}
HashSet<VersionSetting> vs = ...
问题
当Culture相同时,我希望两个VersionSettings相等。
现在不是这样。我该如何解决这个问题?
可以使用从HashSet获取VersionSetting
var b=vs["en-US"];
也许使用某种HashSet扩展?
您可以覆盖Equals
和GetHashCode
,不仅可以比较引用Object.Equals
的作用:
public class VersionSettings
{
public String Culture { get; set; }
public String Domain { get; set; }
public String Name { get; set; }
public override bool Equals(object obj)
{
VersionSettings other = obj as VersionSettings;
if(other == null) return false;
return Culture == other.Culture;
}
public override int GetHashCode()
{
return Culture == null ? 0 : Culture.GetHashCode();
}
}
另一种方法是实现一个不需要修改类本身的自定义IEqualityComparer<VersionSettings>
:
public class VersionSettingComparer : IEqualityComparer<VersionSettings>
{
public bool Equals(VersionSettings x, VersionSettings y)
{
if (x == null && y == null) return true;
if (x == null || y == null) return false;
return x.Culture == y.Culture;
}
public int GetHashCode(VersionSettings obj)
{
if(obj == null) return 0;
return obj.Culture == null ? 0 : obj.Culture.GetHashCode();
}
}
现在您可以使用HashSet<T>
:的构造函数
var vs = new HashSet<VersionSettings>(new VersionSettingComparer());
根据您的第二个问题,如何以这种方式访问HashSet<VersionSetting>
:
var enUsSetting = vs["en-US"];
这不起作用,因为哈希集没有像集合或字典那样的索引器。您可能想要Dictionary<string, VersionSettings>
。
作为一种简单但不那么有效的解决方法,您可以使用LINQ:
var enUsSetting = vs.FirstOrDefault(x => x.Culture == "en-US");
如果你想创建上面提到的词典,你也可以使用LINQ:
Dictionary<string, VersionSettings> cultureLoookup = vs
.ToDictionary(x => x.Culture, x => x); // you only need to create this once
现在这个工作:
var enUsSetting = cultureLoookup["en-US"];
为什么不使用Dictionary<string, VersionSettings>
。用于安装:
var settings = new Dictionary<string, VersionSettings>();
settings["en-US"] = usSettings;
settings["es-ES"] = esSettings;
...
var currentSetting = settings[currentSettingIdText];
这只是一个提示。