使用哈希集C#选择项
本文关键字:选择 哈希集 | 更新日期: 2023-09-27 17:58:17
我有一个哈希集。是否有一种方法可以利用IEqualityComparer来检索您传递的对象满足IEqualityComparer中定义的equals方法的项?
这也许可以解释更多。
public class Program
{
public static void Main()
{
HashSet<Class1> set = new HashSet<Class1>(new Class1Comparer());
set.Add( new Class1() { MyProperty1PK = 1, MyProperty2 = 1});
set.Add( new Class1() { MyProperty1PK = 2, MyProperty2 = 2});
if (set.Contains(new Class1() { MyProperty1PK = 1 }))
Console.WriteLine("Contains the object");
//is there a better way of doing this, using the comparer?
// it clearly needs to use the comparer to determine if it's in the hash set.
Class1 variable = set.Where(e => e.MyProperty1PK == 1).FirstOrDefault();
if(variable != null)
Console.WriteLine("Contains the object");
}
}
class Class1
{
public int MyProperty1PK { get; set; }
public int MyProperty2 { get; set; }
}
class Class1Comparer : IEqualityComparer<Class1>
{
public bool Equals(Class1 x, Class1 y)
{
return x.MyProperty1PK == y.MyProperty1PK;
}
public int GetHashCode(Class1 obj)
{
return obj.MyProperty1PK;
}
}
如果要基于单个属性检索项,则可能需要使用Dictionary<T,U>
而不是哈希集。然后,您可以使用MyProperty1PK
作为关键字将这些项放置在字典中。
然后您的查询变得简单:
Class1 variable;
if (!dictionary.TryGetValue(1, out variable)
{
// class wasn't in dictionary
}
考虑到您已经在使用只使用该值作为唯一性标准的比较器进行存储,因此只使用该属性作为字典中的键并没有什么缺点。