Вопрос:

Список с пользовательским типом

c# .net list linq

123 просмотра

5 ответа

242 Репутация автора

Я хочу сказать, что я изучаю язык с помощью простого кодирования.

Если я создаю объект ResourceTemplateкак

public class ResourceTemplate
{
    public string Name;
    public int Value;
}

А потом сделал

List<ResourceTemplate> resource = new List<ResourceTemplate>();

Этот ресурс будет список со структурой из ResourceTemplate. Если это так, почему я не могу использовать resource.Add("product", 500);?

Компилятор говорит, что:

он не может сделать перегрузку с помощью функции .Add ()

,

Автор: WhiteGlove Источник Размещён: 29.12.2017 01:48

Ответы (5)


5 плюса

31056 Репутация автора

Вы должны создать новый экземпляр класса:

resource.Add(new ResourceTemplate {Name = "product", Value = 500});

Или вот так:

ResourceTemplate resourceTemplate = new ResourceTemplate
{
    Name = "product",
    Value = 500
};
resource.Add(resourceTemplate);

Однако, добавив конструктор в ваш класс, вот так:

public class ResourceTemplate
{
    public ResourceTemplate(string name, int value)
    {
         Name = name;
         Value = value;
    }
    public string Name;
    public int Value;
}

Вы можете тогда:

resource.Add(new ResourceTemplate("product", 500 ));

Также я бы посоветовал вам использовать свойства вместо открытых полей:

public string Name { get; set; }
public int Value { get; set; }
Автор: Salah Akbari Размещён: 29.12.2017 01:50

3 плюса

10447 Репутация автора

Решение

List<T>.Add ожидает экземпляр указанного типа, а не список аргументов, которые могли бы создать такой тип.

Например (используя синтаксис инициализатора объекта):

resource.Add(new ResourceTemplate {Name = "product", Value = 500});

Вы также можете дополнительно использовать синтаксис инициализатора коллекции:

var resource = new List<ResourceTemplate>() {{Name = "product", Value = 500}};
Автор: Adrian Размещён: 29.12.2017 01:51

1 плюс

4321 Репутация автора

По умолчанию: resource.Addможет принимать только ResourceTemplateкак параметр.

Правильный синтаксис должен быть:

var resourceTemplate = new ResourceTemplate 
{
    Name = "product",
    Price = 500,
};

resource.Add(resourceTemplate);

Вы не можете сделать это, потому что нет версии, Addкоторая может принять строку и целое число и преобразовать в неизвестную ResourceTemplateструктуру.

Чтобы добавить перегрузку, Addвы можете создать метод расширения:

public static class ListExtensions 
{
    public static void Add(this List<ResourceTemplate> list, string name, string price)
    {
        var resourceTemplate = new ResourceTemplate 
        {
            Name = name,
            Price = price,
        };

        list.Add(resourceTemplate);
    }
}
Автор: Daniel Tran Размещён: 29.12.2017 01:56

1 плюс

94 Репутация автора

Вы можете использовать базовую структуру коллекции.

public class ResourceTemplate
{
    public string Name;
    public int Value;
}
public class ResourceTemplateList : System.Collections.CollectionBase
{
    public void Add(string name, int value)
    {
        this.List.Add(new ResourceTemplate { Name = name, Value = value });
    }
}

Затем вы можете добавить членов класса в список.

ResourceTemplateList r_templates = new ResourceTemplateList();

r_templates.Add("product", 500);
Автор: muludag Размещён: 29.12.2017 02:59

0 плюса

242 Репутация автора

Пока это основные концепции (и решения), которые я решил в этом вопросе:

//Declarations of Lists

public List<ResourceTemplate> stockpile = new List<ResourceTemplate>();

//We pass to the obj a name and creates the obj with the name and a 
stockpile

public NationBuilder(string name)
        {
            this.Name = name;

            stockpile = new List<ResourceTemplate>();}
//We can add resources into the stockpile with LINQ

public void AddResource(string itemName, int quantity,  float value)//Adds 
Resources to the stockpile
    {
     stockpile.Add(new ResourceTemplate {Name = itemName, Quantity = 
     quantity, Value = value });
    }

Результатом этого решения является структура данных:

- nation
   - Name
   - Stockpile
     -[0] <-Here
        - Name "resourceName"
        - Quantity "quantity"
        - Value "value"

Здесь: я хотел бы иметь вместо индексации через in, чтобы индексировать через имя. Вместо

[0] -> [Coal]
         - Quantity
         - Value

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

Автор: WhiteGlove Размещён: 29.12.2017 07:22
32x32