我正在阅读"首先面向对象的设计和分析"我被困在第254页。
在下面的java代码中,我试图转换" Matches" c#one的方法。
public class InstrumentSpec {
private Map properties;
public InstrumentSpec(Map properties) {
if (properties == null) {
this.properties = new HashMap();
} else {
this.properties = new HashMap(properties);
}
}
public Object getProperty(String propertyName) {
return properties.get(propertyName);
}
public Map getProperties() {
return properties;
}
public boolean matches(InstrumentSpec otherSpec) {
for (Iterator i = otherSpec.getProperties().keySet().iterator();
i.hasNext(); ) {
String propertyName = (String)i.next();
if (!properties.get(propertyName).equals(
otherSpec.getProperty(propertyName))) {
return false;
}
}
return true;
}
}
这是我到目前为止的C#代码:
public class InstrumentSpec
{
private IDictionary _properties;
public InstrumentSpec(IDictionary properties)
{
this._properties = properties == null ? new Hashtable() : new Hashtable(properties);
}
public object GetProperty(string propertyName)
{
return _properties.Contains(propertyName);
}
public IDictionary Properties
{
get { return _properties; }
set { _properties = value; }
}
public virtual bool Matches(InstrumentSpec otherSpec)
{
foreach (var prop in otherSpec.Properties)
{
if (!prop.Equals(otherSpec.Properties))
{
return false;
}
}
return true;
}
}
任何人都知道如何使匹配方法工作,以便检查两个对象是否匹配?
答案 0 :(得分:2)
Java代码遍历字典键并比较各自的属性值。您当前正在迭代键/值对并将它们与字典进行比较。
我想像是
foreach (var key in otherSpec.Properties.Keys)
{
if (!Properties[key].Equals(otherSpec.Properties[key]))
{
return false;
}
}
return true;
将是一个更好的翻译。
答案 1 :(得分:1)
你可以完全复制算法,如果这就是你想要的:
public virtual bool Matches(InstrumentSpec otherSpec)
{
foreach (var prop in otherSpec.Properties.Keys)
{
if (!Object.equals(properties[prop], otherSpec[prop]))
{
return false;
}
}
return true;
}
但我会建议,使用泛型来了解我们正在谈论的类型
答案 2 :(得分:1)
试试这个:
var keysEqual= Properties.Keys.SequenceEqual(otherSpec.Properties.Keys);
var valuesEqual = Properties.Values.SequenceEqual(otherSpec.Properties.Values);
if(keysEqual && valueEqual)
{
//objects have the same properties and values
}
答案 3 :(得分:1)
看看你的比较:
if (!prop.Equals(otherSpec.Properties))
您何时期望任何单个“属性”等于包含它的“属性”集合? Java代码正在与对象的内部“属性”集合进行比较:
if (!properties.get(propertyName).equals(
otherSpec.getProperty(propertyName)))
这基本上意味着它循环遍历“属性”的集合,并且对于该集合中的每个“属性”,它将它与另一个集合中类似命名的“属性”进行比较。但是你不在这里引用对象的集合:
private IDictionary _properties;
您需要将一个集合中的值与另一个集合中的值进行比较。如果没有检查集合中的值是否存在(我建议这样做),它可能看起来像这样:
foreach (var prop in otherSpec.Properties.Keys)
{
if (!otherSpec.Properties[prop].Equals(_properties[prop]))
{
return false;
}
}
return true;