我有一个对象:
public List<double> obj { get; set; }
public class Employee
{
public int EmployeeId { get; set; }
public int Skillssetpoints { get; set; }
public string Name { get; set; }
public Nullable<System.DateTime> Date { get; set; }
}
记录是这样的:
EmployeeId SkillssetPoints Date
1 5 4/5/2016 16:12:12
2 12 3/5/2016 17:12:12
3 4 8/5/2016 8:12:12
4 20 1/5/2016 2:12:12
这个obj会像这样包含价值:
"obj":[10,20]
现在我想要做的是我将获得所有员工数据,并且对于每个员工数据,我将执行乘法运算 像这样:
1st records:obj[0] * Skillssetpoints (10*5=50)
2nd records:obj[0] * Skillssetpoints (20*12=240)
这是我的循环:
var employeeList=context.Employee.ToList();
foreach (var item in employeeList.Select((value, index) => new { value, index }))
{
var employee = new Employee();
employee.Skillssetpoints=obj[item.index] * item.Skillssetpoints;
//Save records in database
}
但是这里的问题是我为员工获得4条记录,而我的obj包含2个值,因此低于错误:
错误:索引超出范围。必须是非负数且小于集合的大小。
注意:我还想考虑当我的员工记录少于列表对象中的项目时的情况。
如何正确配置此循环?
答案 0 :(得分:2)
您可以使用Enumerable.Take()
根据n
中的项目数仅处理第一个obj
项:
foreach (employeeList.Take(obj.Count).Select((value, index) => new { value, index }))
{
.....
}
如果obj
中的项目数量超过employeeList
中的项目数量,这也应该适用。在这种情况下,只会处理与employeeList
一样多的数据。
答案 1 :(得分:1)
仅当Value
中有效obj
时才计算技能点。
foreach (var item in employeeList.Select((value, index) => new { value, index }))
{
var employee = new Employee();
if(item.index >= 0) // Calculate Skill points only when value is avialable.
employee.Skillssetpoints=obj[item.index] * item.Skillssetpoints;
//Save records in database
}
如果您想忽略插入空记录,可以在循环内调用break
。
foreach (var item in employeeList.Select((value, index) => new { value, index }))
{
var employee = new Employee();
if(item.index < 0) break;
employee.Skillssetpoints=obj[item.index] * item.Skillssetpoints;
//Save records in database
}