2012-04-05 15 views
1

私は現在のすべての学期を返す次のコードを持っています。コレクションに「Summer」の学期があるかどうかを確認し、それを「Summer 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

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

素晴らしい作品です。また、3つの夏期セメスターもあります。どのように値を増やしますか?例えばSummer I、Summer II、Summer III?ありがとうございました。 – HardCode

+0

サマーIとサマーIIを交換しますか?そのローマ数字は? –

+0

はい、夏期学期には3つの夏の名前がありますが、日付は異なります。私はちょうどそれを順番に名づけたいと思う。 – HardCode

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を呼び出していますか?これはほとんど常に間違っていますが、IList < T>またはList < T>ではなく、IEnumerable < T>の方が一般的に適しています。

+0

なぜそれが好奇心の中でほとんど常に間違っていると言いますか?方法から帰ってくるという文脈で間違っているのか、より一般的には意味がありますか? –

+0

これは間違っています。これは、複雑なAPIを使用する可能性が低いからです(たとえば、後で配列やその他のコレクション型に変更するのが難しくなるなど)。パフォーマンス上の理由から、一度に1つのアイテムのみをストリーミングするように設定するのではなく、不要なコピーを作成することを犠牲にして、リスト項目をすぐに実現することができます。 –

+0

よろしいですか。私は、「ほとんどいつも間違っている」ということの範囲を明確にしようとしていたと思います。シーケンスを前向きに評価したいという状況を想像することができます(例えば、データベースから少量の情報を後で使用し、その間に接続を開いたままにしたくない場合)。 IEnumerable'を好む理由を、私が完全には理解していないのは、必ずしもすべての状況において正しい選択であるとは思っていません。 –

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); 
    } 
    } 
} 
関連する問題