HashSet.Contains很快,但是我需要搜索对象的多个属性。

7 浏览
0 Comments

HashSet.Contains很快,但是我需要搜索对象的多个属性。

我有一个变量itemList,它是一个List,还有一个变量searchSet,它是一个HashSet(使用TestItemComparer进行比较)。\n对于itemList中的每个元素,我通过Number属性在searchSet中查找它的存在。\n我的搜索方式如下:(item.Number是itemList的一个枚举元素)\n我使用searchSet.Contains(new TestItem{ Number = item.Number })进行搜索。\n我的TestItemComparer类实现了IEqualityComparer接口,它用于比较TestItem对象的相等性。\nEquals方法用于比较两个TestItem对象的Number属性是否相等。\nGetHashCode方法用于获取TestItem对象的哈希码。\nsearchSet的类型为TestItem而不是整数的原因是因为我仍然希望将搜索与TestItem类的其他属性结合起来使用。\n如何在仍然使用HashSet.Contains方法的前提下,将Number搜索与其他属性结合起来使用?\n我应该修改TestItemComparer来实现这个需求吗?

0
0 Comments

HashSet.Contains is fast but I need to search for multiple properties of an object的问题是,虽然HashSet.Contains方法在查找元素时非常快速,但是当需要搜索对象的多个属性时,就无法满足需求了。

为了解决这个问题,可以通过在Equals和GetHashCode方法中添加其他属性来实现。可以创建一个自定义的比较器类TestItemComparer,实现IEqualityComparer接口,在其中重写Equals和GetHashCode方法来比较对象的多个属性。例如,可以比较TestItem类的Number和Something属性:

public class TestItemComparer: IEqualityComparer

{

public bool Equals(TestItem x, TestItem y)

{

return x.Number == y.Number && x.Something == y.Something;

}

public int GetHashCode(TestItem obj)

{

return obj.Number ^ obj.Something;

}

}

然后,在使用HashSet时,可以传入自定义的比较器类作为参数,以便在查找元素时同时考虑多个属性:

var hashSet = new HashSet(new TestItemComparer());

这样,当调用Contains方法时,可以传入一个具有多个属性的对象进行查找:

hashSet.Contains(new TestItem { Number = 1, Something = "something" });

需要注意的是,比较器应该仅仅用于比较两个对象,而不应该包含其他逻辑。如果需要搜索TestItem.State属性为"blue"或"black"的元素,应该分别调用两次Contains方法来实现。在实现比较器时,不应该使用任何“非常规”的方式,以免导致代码难以理解。

总结起来,当需要在HashSet中搜索对象的多个属性时,可以通过实现自定义的比较器类,并将其传入HashSet的构造函数中来解决这个问题。在比较器中重写Equals和GetHashCode方法来实现多属性的比较,然后在使用HashSet的Contains方法时,传入具有多个属性的对象进行查找。

0