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 = ...

问题

  1. 当Culture相同时,我希望两个VersionSettings相等。

    现在不是这样。我该如何解决这个问题?

  2. 可以使用从HashSet获取VersionSetting

    var b=vs["en-US"];

    也许使用某种HashSet扩展?

HashSet与自定义对象相等,并获取一个元素

您可以覆盖EqualsGetHashCode,不仅可以比较引用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];

这只是一个提示。