2015-12-16 21 views
0

我節省Viewstates這樣幾個學生:如何檢索所有視圖狀態列表

ViewState[currentStudent] = currentGradesList; 

但現在我需要把所有的viewstates讓所有評分的平均值,我已經學會了做它帶有這樣的字符串:

foreach (string str in ViewState.Keys) {....}並且工作。

但現在當我嘗試

foreach(List<double> grades in ViewState.Keys) {....} 

的「等級」仍然無效,我得到的錯誤:

Unable to cast object of type 'System.String' to type 'System.Collections.Generic.List`1[System.Double]'. 

我猜它說,鍵是字符串,但我怎麼會那麼得到所有的名單?

+0

你應該不使用ViewState用於這些目的,這些值如何到達ViewState?你能從任何來源獲得它們,比如數據庫/文件嗎? –

回答

3

您正在循環訪問foreach循環中的鍵的名稱,而不是實際的值。您可以使用foreach循環變量的值(現在是ViewState字典中鍵的名稱)從視圖狀態獲取值。

您的foreach循環更改爲這樣的事情

foreach(var key in ViewState.keys)[ 
    var grades = ViewState[key] as List<double>; 
    //LINQ has built in Average and Sum abilities on lists 
    //I don't know what a CurrentStudentGrades looks like 
    //but here is an example of using the built in average 
    var studentAverage = grades.Average(x=>x.Grade); 
    //do whatever else you are wanting to do 
} 
+1

謝謝你的朋友,你是對的我混名和價值。 我從來沒有使用VAR或作爲,所以我沒有像這樣代替:) 的foreach(在ViewState.Keys字符串str) { 列表 templist =(列表)的ViewState [STR]; } 現在我只是在等待SOF讓我接受答案,你太快了! :D – humudu

+0

linq的解決方案很好很簡單,但我正在爲考試做準備,他們希望我不要使用它 – humudu

+0

@humudu - 真棒好友,很高興你能再次工作。我對LINQ很瞭解,它很高興知道如何自己做。哦,var只是告訴編譯器'隱式'確定類型。它會查看一個var聲明並說,嘿,你給我一個字符串作爲一個值,我必須是一個字符串變量! – Tommy

1
foreach (string str in ViewState.Keys) 
{ 
    var grades = ViewState[str] as List<double>; 
    if(grades != null) 
    { 
     var average = grades.Average(); 
    } 
} 
+0

謝謝!好的和快速的回​​答 – humudu

+1

請解釋你的答案,以便其他人知道爲什麼這個工作。 –

0

解決方案: 我是通過視圖狀態鍵,而不是值的名稱循環。所以,現在我把它改成

Foreach (string str in ViewState.Keys) 
{ //And then the value of "str"... 
List<double> templist = (List<double>)ViewState[str]; 

然後我的代碼的其餘部分不事真的,但在這裏它是讓每個學生的平均成績,和所有的學生一起

foreach (double grade in templist) 
{ 
currenttotal += grade; 
} 
currentaverage = currenttotal/templist.count; 
AllAveragesList.add(currentaverage) 

foreach (double average in AllAveragesList) 
{ 
totalOfAll += average 
} 
averageOfAll = totalOfAll/AllAveragesList.count();`