2011-10-28 15 views
0
switch(ID) 
{ 
    case "CustomReportsContainer": 
     foreach (var report in SessionRepository.Instance.CustomReports.ToList()) 
     { 
      var reportItem = new RadListBoxItem(report.Name, report.ID.ToString()); 
      if (!Items.Any(item => int.Equals(item.Value, reportItem.Value))) 
      { 
       Items.Add(reportItem); 
      } 
     } 
     break; 
    case "HistoricalReportsContainer": 
     foreach (var report in SessionRepository.Instance.HistoricalReports.ToList()) 
     { 
      var reportItem = new RadListBoxItem(report.Name, report.ID.ToString()); 
      if (!Items.Any(item => int.Equals(item.Value, reportItem.Value))) 
      { 
       Items.Add(reportItem); 
      } 
     } 
     break; 
} 

HistoricalReportsとCustomReportsは異なるタイプのコレクションですが、私は各オブジェクトタイプと同じ2つのプロパティに興味があります。私はLINQのSelectを使用して、匿名で型付けされたオブジェクトのリストを作成できるはずだと考えました。これを匿名型を使用してより簡潔に表現できますか?

私は、暗黙的に型付けされた変数をそれに割り当てることなく作成することはできません。私はSwitchステートメントのスコープの中にいるので... switchステートメントの内部でvarに代入することはできず、switchステートメントの外側で残りのコードを移動することはできません。

このコードをどのように表現すればよいですか?現在のインプリメンテーションは「ベスト」ですか?

ugg、閉じる。これで何かできますか?私たちのAPIを介しているので、私はそれ以上深く変更することはできません。

ReportServices.GetAllCustomReports().Select(report => new { report.Name, report.ID}).ToList().ForEach(customReport => _customReports.Add(customReport)); 

Error 2 Argument 1: cannot convert from 'AnonymousType#1' to 'CableSolve.Web.Dashboard.IReport' 
+0

これはまったく役に立ちません。私は今リファクタリングの過程にいるので、私はここにいて、質問と学習を求めています。 –

答えて

4
CustomReport

HistoricalReportは、(少なくとも)IdNameプロパティを含むIReportインタフェースを実装しなければなりません。

switch(ID) 
{ 
    case "CustomReportsContainer": 
     AddReportItems(SessionRepository.Instance.CustomReports); 
     break; 
    case "HistoricalReportsContainer": 
     AddReportItems(SessionRepository.Instance.HistoricalReports); 
     break; 
} 

private void AddReportItems(IEnumerable<IReport> reports) 
{ 
    foreach (var report in reports) 
    { 
     var reportItem = new RadListBoxItem(report.Name, report.ID.ToString()); 
     if (!Items.Any(item => int.Equals(item.Value, reportItem.Value))) 
     { 
      Items.Add(reportItem); 
     } 
    } 
} 

編集

あなたの追加質問に応えてGetAllCustomReportsIReportインターフェイスを実装する型を返すようにするために、それは可能でしょうか?これにより、Select(report => new { report.Name, report.ID})を介して匿名タイプに投影する必要がなくなり、残りの問題を解決する必要があります。

+0

例をありがとう! :) –

+0

だから私は本当に近いです..このインターフェイスを使用して私のコードが改善される場所の多くを見ることができます。私の元の投稿への編集をチェックして、私たちのAPIによって導入された制限が私のIReportの使用を無効にするかどうか確認できますか? –

2

項目がインタフェースまたは基本型を共有する(または彼らが行うように、あなたがそれらを変更することができます)場合 - その後、あなたがそのタイプに基づいてLINQクエリを表現することができるだろう。

もしそうでなければ、同じプロパティを共有しているので、C#4の場合はdynamicと入力できます。

0

同じ2つのプロパティを探していて、同じ名前を使用している場合は、小さなインターフェースの候補がありますか?

関連する問題