2012-03-25 11 views
1

次の方法を記述する方法はありますか?多分LINQを使用する? 新しいリストを宣言してからforeachを使用してリストを作成するのではなく、LINQを使用して1行でこれを行うより良い方法がありますか?あなたがIEnumerable<RoleAreasModel>を返すのでLINQを使用してメソッドを改善する

public IEnumerable<RoleAreasModel> GetRolesWithRoleAreasModelByUserGUID(Guid guid) 
    { 
     IList<RoleAreasModel> rolesWithRoleAreas = new List<RoleAreasModel>(); 
     foreach (AspnetRolesRecord role in GetByUserGUID(guid)) 
     { 
     RoleAreasRecord roleAreaRecord = RoleAreasService.Instance.GetRecord(RoleAreasRecord.Fields.ID, role.ID); 
     rolesWithRoleAreas.Add(new RoleAreasModel(roleAreaRecord.Area, new RolesMapper().MapToModel(role), getAreaControllersData(roleAreaRecord.ID))); 
     } 
     return rolesWithRoleAreas; 
    } 
+8

なぜ7つの読み取り可能な行を1つの読み取り不可能な行に変換しますか? – Oded

+0

ReSharperを使って、私はリンクで置き換えるためにこれらの種類のコードへの自動提案を見ました。ほとんどの時間、それは私には読みにくかった(たぶん経験不足による)。 –

+2

@UweKeim - LINQ、リンクではありません。 – Oded

答えて

4
public IEnumerable<RoleAreasModel> Foo(Guid id) 
{ 
    var mapper = new RolesMapper(); 
    return from role in GetByUserGUID(id) 
      let areaRecord = RoleAreasService.Instance.GetRecord(RoleAreasRecord.Fields.ID, role.ID) 
      select new RoleAreasModel(areaRecord.Area, mapper.MapToModel(role), getAreaControllersData(areaRecord.ID)); 
} 

はそれが役に立てば幸い読みください。

6

、なぜ一時リストを作成するのではなく、yield returnを使うのか?ところで

public IEnumerable<RoleAreasModel> GetRolesWithRoleAreasModelByUserGUID(Guid guid) 
{ 
    foreach (AspnetRolesRecord role in GetByUserGUID(guid)) 
    { 
     RoleAreasRecord roleAreaRecord = RoleAreasService.Instance.GetRecord(RoleAreasRecord.Fields.ID, role.ID); 
     yield return new RoleAreasModel(roleAreaRecord.Area, new RolesMapper().MapToModel(role), getAreaControllersData(roleAreaRecord.ID)); 
    } 
} 

、エリックリッペルトはイテレータとそれらがどのようにC#で働くに関するブログ記事の非常に興味深いシリーズを書きました。非常に価値が

http://blogs.msdn.com/b/ericlippert/archive/2009/07/09/iterator-blocks-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/

+0

なぜLINQではなくイテレータを使用していますか? –

+0

@ AS-CII:Linqはイテレータも返します。イテレータの上に文法的な砂糖を提供するだけで、時にはかなりのパフォーマンスオーバーヘッドがあります。 –

+0

Uhm ...なぜdownvote?この回答は100%正しいです。 Linqはトレンディで表現力がありますが、常にその仕事にとって最高のツールではありません。 –

1

これはいかがですか?

public IEnumerable<RoleAreasModel> GetRolesWithRoleAreasModelByUserGUID(Guid guid) 
{ 
    return GetByUserGUID(guid).Select(role => 
    { 
     var roleAreaRecord = RoleAreasService.Instance.GetRecord(RoleAreasRecord.Fields.ID, role.ID); 
     return new RoleAreasModel(roleAreaRecord.Area, new RolesMapper().MapToModel(role),getAreaControllersData(roleAreaRecord.ID))); 
    }); 
} 
関連する問題