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



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

直接回答您的问题

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

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

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";
}
}
}

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

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

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

你的逻辑不清楚,但肯定在CreateEmpList()内,

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

或在Employee内,类似

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

最新更新