2016-04-09 43 views
1

我有一個目標:如何正確配置foreach循環以避免索引超出範圍錯誤?

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將contaisn值是這樣的:

"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

你確定你有'emplyeeList'的記錄數量相等嗎? –

+0

@HariPrasad:列表對象中員工記錄和數據的數量可以不同,如有時員工記錄可能大於列表對象中的數據,有時員工記錄可能少於列表對象中的數據 –

+1

如何將員工映射到obj案件?你是否想只更新具有有效「值」的員工,並忽略「值」是否可用(在'obj'中)? –

回答

2

您可以使用Enumerable.Take()根據項目的數量來處理obj只有第一n項目:

foreach (employeeList.Take(obj.Count).Select((value, index) => new { value, index })) 
{ 
    ..... 
} 

這也應了的情況下工作時,在obj的項目數量較多,則有在employeeList。在這種情況下,只能處理與employeeList一樣多的數據。

+0

中的值仍然存在,但是當列表obj中的數據少於員工記錄並且您的解決方案給出錯誤時,仍會將數據插入到表中結果 –

+0

你真是個天才男人。你能解釋一下你做了什麼嗎? –

+1

@學習謝謝,我只是借用了LINQ的力量。不知道還有什麼需要解釋的,'Take()'方法只用於返回集合中的第一個'n'項目,就是這樣。檢查上面的鏈接文檔。讓我知道你需要更多解釋哪一部分,如果這不明確 – har07

1

只有在obj有效Value才計算技能點。

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 
}