2012-04-05 74 views
1

我有以下代碼,將返回所有當前學期。如何確定集合中是否存在「夏季」學期,並動態替換爲「夏季I」?如何從以下C#代碼的集合中更改名稱?

return activeSemester.Select(c => new ActiveSemester 
     { 
      id = c.SemesterId, 
      name = c.Name, // Here I want to check if it is Summer    
     }).ToList(); 

更新: 夏季學期舉辦3名夏季,但日期不同。我只想按順序命名它。每個人都有獨特的SemesterId。

回答

1

因此,你可以準確地說明你的3個不同的夏季課程,我認爲有條件的方法會更有意義。如果您實現任何一種遞增的方法和數據傳遞到這個方法是不正確排序,你可以標記一個ActiveSemster"Summer I"當日期或學期ID匹配"Summer II"

你可以直接包括條件LINQ查詢或者創建將根據日期或semster ID

return activeSemester.Select(c => new ActiveSemester 
{ 
    id = c.SemesterId, 
    name = c.Name == "Summer" ? GetSummmer(c.StartDate, c.EndDate) : c.Name 
}).ToList(); 

private string GetSummer(DateTime startDate, DateTime endDate) 
{ 
    if (startDate == summer1Start || endDate == summer1End) 
     return "Summer I"; 
    if (startDate == summer2Start || endDate == summer2End) 
     return "Summer II"; 
    if (startDate == summer3Start || endDate == summer3End) 
     return "Summer III"; 

    return "Unknown Summer"; 
} 

private string GetSummer(Integer semesterId) 
{ 
    if (semesterId == summer1Id) 
     return "Summer I"; 
    if (semesterId == summer2Id) 
     return "Summer II"; 
    if (semesterId == summer3Id) 
     return "Summer III"; 

    return "Unknown Summer"; 
} 
+0

謝謝,好主意! – HardCode 2012-04-05 20:17:48

5
return activeSemester.Select(c => new ActiveSemester 
{ 
    id = c.SemesterId, 
    name = c.Name == "Summer" ? "Summer I" : c.Name 
}).ToList(); 
+0

它很棒,我也有三個夏季學期!我如何增加價值。例如夏季I,夏季II,夏季III?謝謝。 – HardCode 2012-04-05 19:05:47

+0

那麼用Summer II替換Summer I吧?等等是羅馬數字嗎? – 2012-04-05 19:08:48

+0

是的,夏季學期舉辦3個夏季名稱,但日期不同。我只想按順序命名它。 – HardCode 2012-04-05 19:10:44

0
return activeSemester.Select(c => new ActiveSemester 
     { 
      id = c.SemesterId, 
      name = c.Name.Replace("Summer", "Summer I") // Here I want to check if it is Summer    
     }).ToList(); 

雖然我吧:你爲什麼打電話.ToList()?這幾乎總是錯誤的,並且通常更好地使用IEnumerable < T>而不是IList < T>或List < T>。

+0

你爲什麼說出於好奇而幾乎總是錯的?只是在從方法返回的情況下,還是更一般地說,你的意思是錯的? – 2012-04-05 20:12:19

+0

這是錯誤的,因爲它與您聯繫的是一個您不太可能使用的更復雜的API(例如,以後難以更改爲數組或其他集合類型),這是錯誤的,因爲它會強制您立即實現列表項目,通常是以犧牲製作不必要的副本爲代價的,而不是一次只設置一個項目。 – 2012-04-05 21:44:55

+0

好吧,夠公平的。我想我試圖澄清「幾乎總是錯誤」的範圍 - 我可以想象上下文中你希望序列被預先評估的地方(例如,也許你正在從數據庫中檢索少量信息到稍後再使用,並且不希望在此期間斷開連接)。我完全同意你在評論中給出的在某些情況下更喜歡'IEnumerable'的原因,我並不完全相信在幾乎任何情況下更喜歡'IEnumerable'都是正確的選擇。 – 2012-04-06 12:27:58

0

對於任何學期數的分配廣義解決方案的任何條款喲識別夏天的方法你可以通過整理學期開始日期來完成以下工作。這樣你就不必依賴於日期或ID的平等。不像psubsee2003的回答那樣優雅或表演。 ConvertToRomanNumeral可以通過搜索SO來實現。

public IEnumerable<ActiveSemester> GetActiveSemesters() 
{ 
    int summerSemesterNumber = 1; 
    int winterSemesterNumber = 1; 
    foreach (ActiveSemester activeSemester in _activeSemesters.OrderBy(c => c.StartDate)) 
    { 
    if (activeSemester.Name == "Summer") 
    {       
     yield return new ActiveSemester(activeSemester) 
         { 
         Name = string.Format("{0} {1}", activeSemester.Name, 
          ConvertToRomanNumeral(summerSemesterNumber++)) 
         }; 
    } 
    else if (activeSemester.Name == "Winter") 
    {       
     yield return new ActiveSemester(activeSemester) 
         { 
         Name = string.Format("{0} {1}", activeSemester.Name, 
          ConvertToRomanNumeral(winterSemesterNumber++)) 
         }; 
    } 
    else 
    { 
     yield return new ActiveSemester(activeSemester); 
    } 
    } 
} 
相關問題