Как объединить несколько значений списка и создать уникальное имя - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть объект списка с 3-4 элементами, такими как (цвет, размер, единица измерения), и у каждого списка есть другой список, такой как список цветов имеет несколько значений (красный, зеленый, синий).Я хочу создать такие имена, как (red-xl-pcs) (red-xxl-pcs) (blue-xl-pcs) (blue-xxl-pcs)

Моя модель:

public class Attributes
{
    public int AttributeId { get; set; }
    public string AttributeName { get; set; }

    public IEnumerable<AttributesValue> AttributesValues { get; set; }
}

public class AttributesValue
{
    public int AttributeValueId { get; set; }
    public string AttributeValueName { get; set; }
}

Мой контроллер:

public async Task<ActionResult> GetProductAttribute(int productId)
    {
        LoadSession();
        var productAttributes = await _objProductDal.GetProductAttribute(productId, _strWareHouseId, _strShopId);


        foreach (var attribute in productAttributes)
        { 
            attribute.AttributesValues = await _objProductDal.GetProductAttributeValue(productId, attribute.AttributeId, _strWareHouseId, _strShopId);
        }

        return PartialView("_AttributeTablePartial", productAttributes);
    }

Мой вывод такой: enter image description here

Теперь я хочу добавить еще один список имен со всеми именами значений, такими как:

(12 / y - хлопок - зеленый), (12 / y - хлопок - желтый) .... он сгенерирует 8 уникальных названий продуктов.

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Это то, что вы после?Повторение каждого списка и объединение всех возможностей?

var first = new List<string> { "one", "two" };
var second = new List<string> { "middle" };
var third = new List<string> { "a", "b", "c", "d" };
var all = new List<List<string>> { first, second, third };

List<string> GetIds(List<List<string>> remaining)
{
    if (remaining.Count() == 1) return remaining.First();
    else
    {
        var current = remaining.First();
        List<string> outputs = new List<string>();
        List<string> ids = GetIds(remaining.Skip(1).ToList());

        foreach (var cur in current)
            foreach (var id in ids)
                outputs.Add(cur + " - " + id);

        return outputs;
    }
}

var names = GetIds(all);

foreach (var name in names)
{
    Console.WriteLine(name);
}

Console.Read();

приводит к следующему:

one - middle - a
one - middle - b
one - middle - c
one - middle - d
two - middle - a
two - middle - b
two - middle - c
two - middle - d

скопировано и слегка адаптировано из Создать все комбинации из нескольких (n) списков

1 голос
/ 25 апреля 2019

Вот метод, который использует вложенные функции для строкового преобразования объектов:

public static string GetUniqueName(IEnumerable<Attributes> source)
{
    return "[{" + String.Join("},{", source.Select(AttributeToString)) + "}]";
    string AttributeToString(Attributes a)
    {
        return a.AttributeId + ":" + a.AttributeName + "[" + String.Join(",",
            a.AttributesValues.Select(ValueToString)) + "]";
    }
    string ValueToString(AttributesValue av)
    {
        return av.AttributeValueId + ":" + av.AttributeValueName;
    }
}

Пример использования:

var productAttributes = new string[] {"Car", "Bike"}.Select((s, i) => new Attributes()
{
    AttributeId = i + 1,
    AttributeName = s,
    AttributesValues = new AttributesValue[]
    {
        new AttributesValue{AttributeValueId = 1, AttributeValueName = s + "Attr1"},
        new AttributesValue{AttributeValueId = 2, AttributeValueName = s + "Attr2"},
    }
});
Console.WriteLine(GetUniqueName(productAttributes));

Выход:

[{1: Автомобиль [1: CarAttr1,2: CarAttr2]}, {2: велосипед [1: BikeAttr1,2: BikeAttr2]}]

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