列出自定义类型

时间:2017-12-29 13:48:02

标签: c# .net list linq

我想说我正在通过简单的编码来学习语言。

如果我创建一个对象ResourceTemplate

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

然后做了

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

该资源将是一个包含ResourceTemplate结构的列表。 如果是这样,为什么我无法使用 resource.Add("product", 500);?

编译器说:

  

它无法使用.Add()函数重载

5 个答案:

答案 0 :(得分:5)

您应该创建一个新的instance类:

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

或者像这样:

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

但是,通过向您的班级添加constructor,就像这样:

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 ));

此外,我建议您使用properties代替公共字段:

public string Name { get; set; }
public int Value { get; set; }

答案 1 :(得分:3)

List<T>.Add需要指定类型的实例,而不是创建这种类型的参数列表。

例如(使用对象初始化程序语法):

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

您还可以使用集合初始化程序语法:

var resource = new List<ResourceTemplate>() {{Name = "product", Value = 500}};

答案 2 :(得分:1)

默认情况下: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);
    }
}

答案 3 :(得分:1)

您可以使用集合基础结构。

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);

答案 4 :(得分:0)

到目前为止,这些是我在这个问题中解决的主要概念(和解决方案):

//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"

这里:我想通过名称来索引而不是索引。 而不是

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

否则管理库存的处理程序需要事先知道每个资源的位置。