【问题标题】:Using an array in a List - OOP - Generic List在列表中使用数组 - OOP - 通用列表
【发布时间】:2016-03-23 07:11:13
【问题描述】:

我已经创建了一个列表:

List<Employee> employees = new List<Employee();

我想实现这个:

Employee e1 = new Employee(Job.Employee, "Name", "C Sharp", "Oracle", "SQL");

我目前有这个:

Employee e1 = new Employee(Job.Employee, "Name", Skills.CSharp);

这是Employee类中的代码

public enum Job { Employee, Supervisor, Administrator };
public enum Skills {CSharp, SQL, PHP, Javascript, Web, Python, Oracle, CPlus, Perl };

protected Job job;
protected String employeeName;
protected String employeeName;

public Job Job
{
    get { return job; }
    protected set { job = value; }
}

public String EmployeeName
{
    get { return employeeName; }
    protected set { employeeName = value; }
}

public Skills Skills
{
    get {return skills; } 
}

我希望能够输入尽可能多的“技能”,因为我使用了枚举,因此只能在 Employee e1 中输入一项技能。

如何将“技能”数组放入列表/构造函数中?

【问题讨论】:

    标签: c# list oop


    【解决方案1】:

    您可以使用params 数组参数将可变数量的Skills 参数传递给构造函数:

    public Employee(Job job, string name, params Skills[] skills)
    

    您还必须修改skills 字段以保存Skills 的集合而不是单个集合。如果您在创建员工后不添加/删除技能,则可以将其设为数组,如果您需要修改集合,则可以将其设为 IList&lt;Skills&gt;

    例如:

    public class Employee
    {
        private List<Skills> _skills;       // skills stored as a private List 
                                            // to allow modification inside Employee class
    
        public Employee(Job job, string name, params Skills[] skills)
        {
            _skills = new List<Skills>(skills);
            ...
        }
    
        public IReadOnlyList<Skills> Skills // publicly visible as a read-only list
        {
            get { return _skills.AsReadOnly(); }
        }
    
        ...
    }
    

    【讨论】:

    • 并将成员变量和属性改为集合类型。
    • 我的构造函数是这样的:public Employee (Job Job, String Name, Skills Skills) { job = Job; name = Name; skills = Skills;}
    • @Jakub 您能否通过修改技能字段添加更多详细信息?可以举个例子吗?
    • @DannyWatson 当然。检查编辑的答案以获取示例。
    • 虽然我在代码中使用了其他人的答案,但我相信您的代码是最有帮助的,当然您为我的解决方案付出了更多努力。谢谢
    【解决方案2】:

    作为传递Skills[] 的替代方法,您可以将enum 更改为员工所拥有技能的位掩码:

    [Flags]
    enum Skills
    {
       None = 0,
       CSharp = 1 << 0,
       SQL = 1 << 1,
       PHP = 1 << 2,
       Javascript = 1 << 3,
       ...
    }
    

    然后可以将个人技能按位或运算在一起以创建单个员工所拥有的技能:

    Employee e1 = new Employee(Job.Employee, "Name", Skills.CSharp | Skills.SQL | Skills.PHP );
    

    然后要检查员工是否有特定技能,可以使用Enum.HasFlag方法,例如:

    if( e1.Skills.HasFlag( Skills.CSharp ) )
    

    【讨论】:

    • 很好的解决方案,虽然它将技能的数量限制为 32(或 long 底层类型为 64)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多