2014-09-01 4 views
1

Я читаю «Head First объектно-ориентированного проектирования и анализа» и я застрял на странице 254.Преобразование Java код C# код

В коде Java ниже, я пытаюсь преобразовать «Спички» метод to aC# 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; 
    } 
} 

Любой имеет какие-либо идеи, как сделать метод Matching работу таким образом, что он проверяет два объекта совпадают?

+0

разве там .equals() для каждого объекта? –

+0

Да, есть метод equals() для каждого объекта, и, как вы можете видеть, я использовал его в своем коде, но я не могу понять, как правильно это сделать с IDictionary. –

ответ

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; 
+0

Спасибо, Дэвид, отлично работает. –

2

Код Java выполняет итерацию по клавишам словаря и сравнивает соответствующие значения свойств. Вы в настоящее время итерации по парам ключ/значение и сравниваете их со словарем.

Я думаю, что-то вроде

foreach (var key in otherSpec.Properties.Keys) 
{ 
    if (!Properties[key].Equals(otherSpec.Properties[key])) 
    { 
    return false; 
    } 
} 
return true; 

будет лучшим переводом.

+0

Спасибо, Джои, это работает. –

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; 
} 

Но я бы посоветовал, чтобы использовать дженерики, чтобы знать, какие типы мы говорим о

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 
} 
Смежные вопросы