2017-09-01 49 views
0

有什麼辦法可以簡化下面的代碼嗎? supportList是從構造函數得到一個對象:簡化c#if/else語句與不同List <>

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 
    } 
} 

編輯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

您的//代碼在這裏對於所有三個語句塊都是相同的嗎? – Amit

+1

爲什麼不使用泛型? –

+0

是的。你通過不這樣做來簡化這一點。你應該*做什麼,我們不能說。也許[編輯]並描述你的目標是在這裏? – Will

回答

3

這看起來像鴨子打字問題:你的BankCurrencyAmount類型具有相同的成員(Id,NameCode),但共享沒有公共層次結構。

一種解決方案是創建一個新的interface(我把它叫做ICurrencyBankOrAmount),該聲明這些成員,然後將接口添加到您的BankCurrencyAmount模型類,那麼你可以有一個循環體 - 我它轉換爲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; } 
} 

然後,你可以寫

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 }); 
    } 
} 

這依賴於List<T>實現IReadOnlyList<T>的事實,並IReadOnlyList<T>是協變的T,這意味着它可以作爲IReadOnlyList<U>其中U任何基類或透明地傳遞實施界面爲T

+0

感謝您的時間,但戴先生已經與包括linq在內的相同的例子。 – ManOfWar