2017-09-01 3 views
0

次のコードを単純化する方法はありますか? supportListはコンストラクタからなっているオブジェクトです。ここ異なるリストを持つC#if/else文を簡略化する<

public void FillCollection(object supportList) 

コード:

if (supportList is List<Bank>) 
{ 
    foreach (var temp in supportList as List<Bank>) 
    { 
     //code here 
    } 
} 
else if (supportList is List<Currency>) 
{ 
    foreach (var temp in supportList as List<Currency>) 
    { 
     //code here 
    } 
} 
else if (supportList is List<Amount>) 
{ 
    foreach (var temp in supportList as List<Amount>) 
    { 
     //code here 
    } 
} 

EDIT 1:すべてのforeachの部品は、このルックス

foreach (var temp in supportList as List<Bank>) 
{ 
    string yesno; 
    if (temp.Id == CurrentId) 
    { 
     yesno = "" + yes; 
    } 
    else 
    { 
     yesno = "" + no; 
    } 

    CollectionSupport.Add(new SupportModel { Id = temp.Id, Name = temp.Name, 
    Code = temp.Code, YesNo = "" + yesno }); 
} 
+1

あなたの//コードは、3つのステートメントブロックすべてで同じですか? – Amit

+1

なぜジェネリックではないのですか? –

+0

はい。あなたはこれをしないことでこれを単純化します。あなたがするべきことは、われわれは言うことができない。おそらく[編集]あなたの目標はここに何を記述する? – Will

答えて

3

のように同じコードを実行しますダックタイピング問題のように:あなたのBankCurrency、およびAmountタイプは同じメンバー(IdName、およびCode)ですが、共通の階層はありません。

ソリューションを作成することで、新たなinterfaceこれらのメンバーは、その後、あなたは、単一のループ本体を持つことができ、あなたのBankCurrency、およびAmountモデルクラスにインターフェイスを追加宣言している(私はそれICurrencyBankOrAmountと呼ばれる) - 私はしました次のようにLinq式に変換します。

public void FillCollection<TItem>(List<TItem> supportList) 
    where TITem : ICurrencyBankOrAmount 
{ 

    this.CollectionSupport.AddRange(
     supportList 
      .Select(item => new SupportModel() 
      { 
       Id = item.Id, 
       Name = item.Name, 
       Code = item.Code, 
       YesNo = item.Id == this.CurrentId ? "yes" : "no" 
      }) 
    ) 
} 

これらのクラスを変更できない場合は、アダプタパターンを使用できます。

+1

かなり、そうです。この方法は実際にはここでは一般的である必要はありません。 – hvd

+0

@hvdインタフェースメソッドでvtable呼び出しが一般的にならないようにすることを理解していますが、パフォーマンスの向上はごくわずかです。 – Dai

+0

@Daiこれは、 'TItem'が値型である場合には有益ですが、私は理解していますが、正しくあります。技術的に非ジェネリックなメソッドも機能するとしても、 。 – hvd

2

クラスが共通インターフェイスを実装していることを確認してください。

public interface ISomeDescriptiveNameHere { 
    public string Id { get; } 
    public string Name { get; } 
    public string Code { get; } 
} 

その後、あなたはこれがList<T>IReadOnlyList<T>を実装しているという事実に依存している

public void FillCollection(IReadOnlyList<ISomeDescriptiveNameHere> supportList) { 
    foreach (var temp in supportList) { 
     string yesno; 
     if (temp.Id == CurrentId) { 
      yesno = "" + yes; 
     } else { 
      yesno = "" + no; 
     } 
     CollectionSupport.Add(new SupportModel { Id = temp.Id, Name = temp.Name, Code = temp.Code, YesNo = "" + yesno }); 
    } 
} 

を書くことができ、そしてIReadOnlyList<T>は、それが透過的Uは、任意の基底クラスであるIReadOnlyList<U>またはとして渡すことができることを意味し、Tに共変です実装されたインタフェースはTです。

+0

あなたのお時間をいただき、ありがとうございますが、Daiはlinqを含む同じ例で最初にされています。 – ManOfWar

関連する問題