Как совместить элементы списка? (С #) - PullRequest
1 голос
/ 17 мая 2019

Я работаю в C #.

Как объединить (сумма, плюс, минус) эти элементы класса в обоих списках?

  class Attribute
  {
     public AttributeType WhatAttri;
     public float amount;
  }

  enum AttributeType{
        maxhp, str, dex, int, wis,,,,
  }

  Attribute[] attList1;
  Attribute[] attList2; 

Если конкретные значения такие,

attList1[0] = new Attribute(AttributeType.maxhp, 6)
attList1[1] = new Attribute(AttributeType.str, 4)
attList1[2] = new Attribute(AttributeType.dex, 3)

attList2[0] = new Attribute(AttributeType.str, 9)
attList2[1] = new Attribute(AttributeType.int, 7)
attList2[2] = new Attribute(AttributeType.wis, 5)

Я хочу, чтобы конечный результат был таким (добавляются значения attList1, вычитаются значения attList2, а также дублируется сумма (или минус или плюс) AttributeType)

Таким образом, в приведенных выше двух списках AttributeType.str одинаковы, поэтому вычтите дублированное значение переменной количества attList2 [0] (9) из значения attList1 [1] (4) и исключить этот элемент из attList2.

итоговый результат должен быть,

Attribute[] combinedList; (or List<Attribute> combinedList )

combinedList[0] = new Attribute(AttributeType.maxhp, 6)
combinedList[1] = new Attribute(AttributeType.str, -5)  (4 - 9)
combinedList[2] = new Attribute(AttributeType.dex, 3)
combinedList[3] = new Attribute(AttributeType.int, -7)
combinedList[4] = new Attribute(AttributeType.wis, -5)

Как этого добиться?

Спасибо.

Ответы [ 3 ]

1 голос
/ 17 мая 2019
var result =
     attList2.Select(a => new Attribute(a.WhatAttri, -a.amount)) // line 1
     .Concat(attList1)  // line 2
     .GroupBy(a => a.WhatAttri)  // line 3
     .Select(g => new Attribute(g.Key, g.Sum(a => a.amount)));  // line4

  foreach(var a in result)
  {
    Console.WriteLine($"{a.WhatAttri}: {a.amount}");
  }

Вы хотите подвести итог подсчета первого списка и вычесть суммы второго списка. Поэтому сначала я преобразовываю второй список в новый список с отрицательными суммами (строка 1). затем два списка объединяются в один список (строка 2). Затем большая строка группируется по типу (строка 3). и затем у вас есть структура Ключа и предметов, где вы создаете новые Атрибуты, используя ключ и сумму сумм (строка 4).

Редактировать: заменил «Union» в строке 2 на «Concat», чтобы избежать отбрасывания повторяющихся значений в случае, если в классе Attribute будет использоваться пользовательский метод сравнения

0 голосов
/ 17 мая 2019
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public enum AttributeType
{
    maxhp, str, dex, intel, wis,
}

[System.Serializable]
public class Attribute
{
    public AttributeType WhatAttri;
    public float amount;
    public Attribute(AttributeType type, int a)
    {
        WhatAttri = type;
        amount = a;
    }
}

public class LinqTest : MonoBehaviour
{
    Attribute[] attList1 = new Attribute[3];
    Attribute[] attList2 = new Attribute[3]; 
    void Start()
    {
        attList1[0] = new Attribute(AttributeType.maxhp, 6);
        attList1[1] = new Attribute(AttributeType.str, 4);
        attList1[2] = new Attribute(AttributeType.dex, 3);

        attList2[0] = new Attribute(AttributeType.str, 9);
        attList2[1] = new Attribute(AttributeType.intel, 7);
        attList2[2] = new Attribute(AttributeType.wis, 5);

        Calcul();
    }

    void Calcul()
    {
        var result = attList2
                       .Select(a => new Attribute(a.WhatAttri, -(int)a.amount)) // line 1
                       .Union(attList1)  // line 2
                       .GroupBy(a => a.WhatAttri)  // line 3
                       .Select(g => new Attribute(g.Key, g.Sum(a => (int)a.amount)));  // line4

        foreach (var a in result)
        {
            Debug.Log($"{a.WhatAttri}: {a.amount}");
        }
    } 
}

Это конечный результат тестирования приведенного выше кода по ответам.Использование движка Unity.

0 голосов
/ 17 мая 2019

Основная проблема в том, что у вас не было положительного или отрицательного значения в модификаторе атрибутов.Как бы вы усилили эти качества?Как только это будет исправлено, решение будет простым

Добавьте оба списка с помощью concat, GroupBy AttributeType и выберите значения.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {            
        var attributes = new Attribute[] {
            new Attribute{WhatAttri=AttributeType.maxhp, amount=6 },
            new Attribute{WhatAttri=AttributeType.str, amount=4 },
            new Attribute{WhatAttri=AttributeType.dex, amount=3 },
        };

        //Attribute modifier has to be either positive or negative
        var attributesModifier = new Attribute[] {
            new Attribute{WhatAttri=AttributeType.str, amount=-9 },
            new Attribute{WhatAttri=AttributeType.@int, amount=-7 },
            new Attribute{WhatAttri=AttributeType.wis, amount=-5 },
        };


        var newAttributes = attributes
                                .Concat(attributesModifier)
                                .GroupBy(x => x.WhatAttri)
                                .Select(group => 
                                        new Attribute { 
                                            WhatAttri = group.Key, 
                                            amount = group.Sum(g => g.amount) 
                                        });


        newAttributes.Dump();
    }

    public class Attribute
    {
        public AttributeType WhatAttri { get; set; }
        public float amount { get; set; }
    }

    public enum AttributeType
    {
        maxhp, str, dex, @int, wis
    }
}

OnLine demo https://dotnetfiddle.net/3C7n7F

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