如何使用另一个类的列表变量遍历循环?

时间:2019-09-03 10:49:22

标签: c# asp.net

我正在使用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(){  } 
}

4 个答案:

答案 0 :(得分:2)

您问题的直接答案

这里的主要问题是您不了解面向对象代码的工作方式。您没有使用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";
}

答案 1 :(得分:0)

根据我的评论,一个可能的解决方案:

EmpList声明为: public List<Employee> EmpList { get; private set;}

然后在您的Employee类中:

public void SetLocation()
{
    var otherClassObj = new otherClassObj(); // Or perhaps some other way of getting the object of the other class.

    otherClassObj.CreateEmpList(client); // You may have to change this.

    foreach (var item in otherClassObj.EmpList)
    {
        if (item.Email == "abc@gmail.com")
        {
            item.Location = "US";
        }
    }
}

答案 2 :(得分:0)

如果您主要关注的是设置位置值,如果为空,则设置硬编码值,那么请考虑以下解决方案:

    private string _location;
    public string Location
    {
        get { return _location; }
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                _location = "US";
            }
            else
            {
                _location = value;
            }
        }
    }

答案 3 :(得分:0)

要回答您的问题:public void SetLocation(List<Employee> EmpList)允许SetLocation()中的代码访问列表对象(通过引用传递),但是我怀疑这是您真正想要做的。 (无罪;-)

您的逻辑不明确,但肯定在CreateEmpList()内,

emp.Email = ... 
if (emp.Email...) emp.Location = "..."

或在Employee中,类似

public string Email { get {} set { Email = value; if (value...) Location = "..."; } }