Java HashMap в C# словарь - PullRequest
       1

Java HashMap в C# словарь

0 голосов
/ 29 января 2020

Я использовал HashMap в Java, вот так:

Map<Player, List<Attribute>> map = new HashMap<>();

map.put(
  player("Lebron James"), 
  attribute("mid height", "mid weidght", "high vertical")
);

Это прекрасно работает, но теперь я хотел преобразовать в C#, используя Dictionary:

Dictionary<Player, List<Attribute>> dictionary = new Dictionary<Player, List<Attribute>>();

dictionary.Add(
  player("Kobe Bryant"), // <- Doesn't compile
  attribute("mid height", "mid weidght", "high vertical")
);

Может кто-нибудь объяснить мне, почему C# код не компилируется ? Это сообщение

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

Ответы [ 2 ]

1 голос
/ 29 января 2020

К вашему сведению: принятый ответ с использованием new НЕ является портом предоставленного ответа Java. Конечный результат может быть таким же (и я на самом деле рекомендую использовать новые экземпляры вместо методов, называемых player и attribute), но это не порт ответа Java. Прежде всего, я хотел уточнить, что в этом ответе на случай, если кто-то еще столкнется с таким вопросом и ответом в будущем.

Основываясь на коде Java, похоже, ваша программа должна содержать методы player(String) и attribute(String, String, String), которые возвращают экземпляр Player и List<Attribute> соответственно. Поэтому вы должны создать те же самые методы в программе C#. NET.

Ваш текущий фрагмент Java не работает как есть, и фактически приведет к аналогичной ошибке! Попробуйте онлайн.

Принятый ответ, использующий new для создания новых экземпляров Player и List<Attribute> напрямую, может работать и давать то же самое результаты в обеих программах, но это не прямой порт вашей текущей Java реализации! В противном случае ваш код Java выглядел бы так:

Map<Player, List<Attribute>> map = new HashMap<>();
map.put(
  new Player("Lebron James"), 
  new ArrayList<Attribute>(){{
    add(new Attribute("mid height"));
    add(new Attribute("mid weidght"));
    add(new Attribute("high vertical"));
  }}
);

Попробуйте онлайн.

Предполагая, что вы более полны Java код выглядит примерно так:

  ...

  Map<Player, List<Attribute>> map = new HashMap<>();
  map.put(
    player("Lebron James"), 
    attribute("mid height", "mid weidght", "high vertical")
  );
}

private Player player(String name){
  return new Player(name);
}

private List<Attribute> attribute(String... strAttributes){
  List<Attribute> resultList = new ArrayList<>();
  for(String strAttr : strAttributes){
    resultList.add(new Attribute(strAttr));
  }
  return resultList;
}

Попробуйте онлайн.

Портированный код C#. NET станет это:

  ...

  IDictionary<Player, IList<Attribute>> dictionary = new Dictionary<Player, IList<Attribute>>();
  dictionary.Add(
    player("Lebron James"), 
    attribute("mid height", "mid weidght", "high vertical")
  );
}

private Player player(string name){
  return new Player(name);
}

private IList<Attribute> attribute(params string[] strAttributes){
  IList<Attribute> resultList = new List<Attribute>();
  foreach(string strAttr in strAttributes){
    resultList.Add(new Attribute(strAttr));
  }
  return resultList;
}

Попробуйте онлайн.

Опять же, я в первую очередь создал этот ответ для других людей, сталкивающихся с этим вопросом и ответом в будущее и уточнить, что принятый ответ не является прямым портом предоставленного Java фрагмента.

1 голос
/ 29 января 2020

Вы, вероятно, хотите создать экземпляры - Player и List<Attribute> с его элементами.

dictionary.Add(
  new Player("Kobe Bryant"), 
  new List<Attribute>() {
    new Attribute("mid height"), 
    new Attribute("mid weidght"), 
    new Attribute("high vertical"),
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...