Конвертировать Java лямбда-foreach в HashMap в C# foreach в словаре - PullRequest
0 голосов
/ 29 января 2020

Я здесь с проблемой преобразования Java HashMap foreach l oop в C# foreach ...

 public static Map<Genre, List<Band>> PLAYER_ATTRIBUTE_HASHMAP = load();

Upper У меня есть Java объявление HashMap - я преобразовал его в это в C#:

public static Dictionary<Player, List<Attribute>> PLAYER_ATTRIBUTE_DICTIONARY = load();

В данный момент он не делает никаких исключений, но у меня есть другая проблема с лямбда-выражением foreach l oop на нем ...

В Java это выглядит так:

PLAYER_ATTRIBUTE_HASHMAP.forEach((p, a) -> attributes.addAll(a));

Как это должно выглядеть в C#?

Это может быть нормальным foreach l oop в словаре, но я не могу понять, в чем дело ..

У меня есть еще один l oop, который я в основном конвертирую, но опять же похожие проблемы с C# методами из классов.

    attributes.AddRange(PLAYER_ATTRIBUTE_DICTIONARY.Values.SelectMany(e => e));

        //PLAYER_ATTRIBUTE_DICTIONARY.forEach((p, a)->attributes.AddAll(a));
        List<Attribute> distinctAttributes = Attribute.distinctAttributesList(attributes);
        List<Player> players = new List<Player>(PLAYER_ATTRIBUTE_DICTIONARY.keySet()); // <--- problem with keyset

        PLAYER_ATTRIBUTE_DICTIONARY.forEach((p, a)-> { // <--- and there is also..
            List<Double> encodedPlayers = new List<Double>();
            List<Double> encodedAttributes = new List<Double>();
            foreach (Player player in players)
            {
                if (player.GetName().Equals(p.GetName()))
                {
                    encodedPlayers.Add(1.0);
                }
                else
                {
                    encodedPlayers.Add(0.0);
                }
            }
            foreach (Attribute distinctAttribute in distinctAttributes)
            {
                if (a.stream().anyMatch(attribute->distinctBand.getName().equals(attribute.getName()))) // <--- there is underline with stream and anyMatch
                {
                    encodedAttributes.Add(1.0);
                }
                else
                {
                    encodedAttributes.Add(0.0);
                }
            }
            dictionary.Add(encodedPlayers, encodedAttributes);
        });
        return dictionary;
    }

Ответы [ 2 ]

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

, если attributes - пустой список перед forEach, то в C# было бы лучше выполнить:

var attributes = PLAYER_ATTRIBUTE_DICTIONARY.SelectMany(e => e.Value).ToList();

, если нет, тогда используйте AddRange.

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

Трудно сказать наверняка, не зная, какой тип attributes объявлен как. Похоже, что вы можете захотеть что-то вроде этого:

attributes.AddRange(PLAYER_ATTRIBUTE_DICTIONARY.Values.SelectMany(e => e));

Обновление

На основании вашего измененного вопроса, есть несколько способов взглянуть на это. Чтобы напрямую ответить на заданный вами вопрос (например, как смоделировать Java HashMap foreach в C#), вы можете заменить это:

PLAYER_ATTRIBUTE_DICTIONARY.forEach((p, a)-> {

следующим:

PLAYER_ATTRIBUTE_DICTIONARY.ToList().ForEach(kvp -> {
    var p = kvp.Key;
    var a = kvp.Value;

You может также просто использовать блок foreach:

foreach(var keyValuePair in PLAYER_ATTRIBUTE_DICTIONARY)
{
    var p = keyValuePair.Key;
    var a = keyValuePair.Value;

Но это действительно пример проблемы XY, когда вы спрашиваете, как сделать конкретную вещь c, потому что вы предполагаете, что это способ решить вашу проблему. Вы делаете кучу действительно странных вещей, таких как создание словаря с List<Double> s как ключами и значениями, и где кодируемые значения Double в основном двоичные (один или ноль). Это, вероятно, не нужно для решения проблемы, которую вы пытаетесь решить. Если вы сосредоточитесь на том, какие данные вы на самом деле пытаетесь получить из своего словаря, я подозреваю, что вы, вероятно, могли бы иметь гораздо более простое решение, используя пару базовых c операторов LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...