首页 > 解决方案 > 如何使用另一个类的列表变量迭代循环?

问题描述

我正在使用 C#。我有一个 Employee 类,我从 URL 获取员工数据,然后我在另一个类中创建了一个名为 EmpList 的列表,该类正在填充该信息。我没有得到每个员工的位置,所以我想通过在 Employee 类中设置位置函数来硬编码位置。当前上下文中不存在名称“EmpList”。

我尝试在 CreateEmpList 函数中创建 setLocation 函数,但没有出现错误,但位置为空。我知道我可能在做一些愚蠢的事情,但我真的需要一些帮助。我非常感谢。谢谢你。

这是我的员工班。

public class Employee
{

    public string Name { get; set; }
    public string Email { get; set; }
    public Guid ID { get; set; } 
    public string Location { get; set; }
    public void SetLocation()
    {

        foreach (var item in EmpList) // I'm getting error here
        {
            if (item.Email == "abc@gmail.com")
            {
                item.Location = "US";
            }
    }

在这里,我将列表填充到另一个类中。

    private List<Employee> EmpList = null;
        private void CreateEmpList(SPHttpClient client)
        {
            List<Employee> SortedList = new List<Employee>();
            JObject jsondata = client.ExecuteJson(UriResources); 
            string strjsondata = jsondata.First.First.First.First.ToString();
            JArray jsonArray = JArray.Parse(strjsondata);

            foreach (var item in jsonArray) //  Creating master resources list
            {
                ResourcesExcemptList.ForEach(i => i.ToLower()); 

             if(!ResourcesExcemptList.Contains(item["ResourceEmailAddress"].     
             ToString().ToLower()))
             {
                    if (Boolean.Parse(item["ResourceIsActive"].ToString()))
                    {
                        Employee emp = new Employee();
                        emp.ID = (Guid)item["ResourceId"];
                        emp.Email = item["ResourceEmailAddress"].ToString();
                        emp.Name = item["ResourceName"].ToString();
                        emp.Practice = item["ResourceGroup"].ToString();
                        emp.ApproverID = 
                       (Guid)item["ResourceTimesheetManageId"];

                        SortedList.Add(emp);
                    }
                }
            }
            EmpList= SortedList.OrderBy(o => o.Name).ToList();
            //private void setLocation(){  } 
}

标签: c#asp.net

解决方案


直接回答你的问题

这里的主要问题是您不了解面向对象的代码是如何工作的。您没有使用this,并且您似乎对何时执行类方法以及这意味着什么感到困惑。

奇怪的是,当在一个类方法中时,您仍然希望您需要查看列表以找到正确的对象。这与你应该如何处理它相反。

当一个对象的类方法被执行时,你显然已经找到了你要调用其方法的对象。因为否则您将无法调用该对象的类方法。

所以在这里你需要做的是在调用对象的类方法之前迭代列表,而不是之后。你的Employee班级:

public void SetLocation()
{
    this.Location = "US";
}

接着:

private void CreateEmpList(SPHttpClient client)
{
    // the rest of the code

    EmpList = SortedList.OrderBy(o => o.Name).ToList();

    foreach(var employee in EmpList)
    {
        employee.SetLocation();
    }
}

脚注

您的问题显示了对 OOP 原则的基本混淆,但代码本身显示了对 OOP 原则的不同程度的掌握。我怀疑您自己没有编写此代码,但一位同事编写了。

我之所以提到这一点,是因为我注意到您的示例代码中的注释:

//private void setLocation(){  } 

请注意,它的签名是方法定义的签名,而不是方法调用的签名!

我认为发生的事情是你的同事注释了代码并提醒你创建一个方法,你最终在Employee类而不是另一个类中实现了这个方法(其中有CreateEmpList方法的那个) .

在另一个类中创建方法比将其放入类中更有意义Employee。类似于以下内容:

public void SetLocation(Employee employee)
{
    employee.Location = "US";
}

推荐阅读