2016-04-06 6 views
0

コードの最適化中に、LINQでforeachサイクルを使用するメソッドが見つかりました。私はこのサイクルを使わずに使いたいです。どのように私はそれを変更することができますアドバイス?サイクルを使用しないLINQ

public IEnumerable<Tuple<string, string>> ListAllCoursesWithArea() 
{ 
    List<Tuple<string,string>> final = new List<Tuple<string, string>>(); 
    Tuple<string, string> tmp; 

    var books = (
    from temp in bookListLoader.LoadList() 
    group temp by new { temp.CourseCode } into g 
    select g.First() 
    ).ToList(); 

    foreach (BookListRecord i in books) 
    { 
     tmp = new Tuple<string, string>(i.CourseCode, i.Area); 
     final.Add(tmp); 
    } 
    return final; 
} 

私はこれを試してみましたが、それは私にエラーメッセージ "期待識別子" を与える:

public IEnumerable<Tuple<string, string>> ListAllCoursesWithArea() 
{ 
    var books = (
    from temp in bookListLoader.LoadList() 
    group temp by new { temp.CourseCode } into g 
    select g.First().(new Tuple<g.CourseCode,g.Area>()) 
    ).ToList(); 
    return books; 
} 

答えて

1

読み取り可能と最短の道:

public IEnumerable<Tuple<string, string>> ListAllCoursesWithArea() 
{ 
    return bookListLoader 
       .LoadList() 
       .GroupBy(x => x.CourseCode) 
       .Select(g => g.First()) 
       .Select(x => new Tuple<string, string>(x.CourseCode, x.Area)); 
} 

またはあなたの例では:

public IEnumerable<Tuple<string, string>> ListAllCoursesWithArea() 
{ 
    return from temp in bookListLoader.LoadList() 
      group temp by new { temp.CourseCode } into g 
      let x = g.First() 
      select new Tuple<string, string>(x.CourseCode, x.Area); 

} 
+0

2つの選択肢を1つのselect-manyにフラット化する可能性があります。 – code4life

+0

@ code4lifeおそらくはいですが、この場合、 'First()'を2回評価する必要があります。 –

+0

いいえ、私はあなたが 'First()'からTupleを作成することができると思います。 – code4life

関連する問題