将java代码转换为c#代码

时间:2014-09-01 11:42:10

标签: c#

我正在阅读"首先面向对象的设计和分析"我被困在第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;
    }
}

任何人都知道如何使匹配方法工作,以便检查两个对象是否匹配?

4 个答案:

答案 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;