【问题标题】:List with a custom type具有自定义类型的列表
【发布时间】:2017-12-29 13:48:02
【问题描述】:

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

如果我创建一个对象ResourceTemplate as

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

然后制作

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

该资源将是具有ResourceTemplate 结构的列表。 如果是这样,为什么我不能使用 resource.Add("product", 500);?

编译器说:

它不能使用 .Add() 函数进行重载

.

【问题讨论】:

  • 为什么你认为你可以这样做?
  • 为什么不能 -> 看看MSDN List<T>.Add 文档。
  • 因为 'Add()' 只接受对象作为参数
  • 好像我做了一个接收不同参数的自定义函数。
  • 你认为这是带有emplace_back的C++吗?

标签: c# .net list linq


【解决方案1】:

您应该创建一个新的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; }

【讨论】:

  • 谢谢你的帮助,伙计!
【解决方案2】:

List&lt;T&gt;.Add 需要指定类型的实例,而不是创建此类类型的参数列表。

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

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

您还可以另外使用集合初始化语法:

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

【讨论】:

  • 所以为了“重载”那个 .Add 函数,我可以实例化我的 ResourceTemplate 类吗?有点混乱,我会深入研究。
【解决方案3】:

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

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】:

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

    【讨论】:

    • 我已经更新了答案,以防您需要重载 Add 方法
    • 是的,这就是我想要的,因为我将有某种数据库来加载一堆“资源”,我需要一个快速的方法。真的很感激!
    • 你能解释一下这部分吗?此 List 列表。我知道这是什么,但我需要理解这个概念。
    • docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… - 它被称为扩展方法。它向现有类添加了一个新方法
    【解决方案5】:

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

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

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

    【讨论】:

    • 感谢所有合作(并编辑我的错误)的人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多