2014-02-12 83 views
2

我正在將diffuculties封裝在轉換一小段代碼的過程中。如果我能得到一些很棒的指導。該代碼目前在C中,而我正試圖轉換爲C#。轉換數據結構

typedef struct sched_pmt *sched_pmt_ptr; 
typedef struct sched_pmt 
{ 
    unsigned period_num; 
    double interest; 
    double principal; 
    double advanced_pmt; 
    double total_pmt; 
    double balance; 
} 
sched_pmt; 

我想我得到sched_pmt下面,但不確定如何做指針。

public class sched_pmt 
    { 
     private uint period_num { get; set; } 
     double interest { get; set; } 
     double principal { get; set; } 
     double advanced_pmt { get; set; } 
     double total_pmt { get; set; } 
     double balance { get; set; } 
    } 

C代碼實例。

sched_pmt_ptr pmtsched = NULL; 

pmtsched->period_num = s++; 
pmtsched->interest = pmt_int; 
pmtsched->principal = prin; 
pmtsched->advanced_pmt = adv_pmt; 
pmtsched->total_pmt = pmt + adv_pmt; 
pmtsched->balance = pv; 
pmtsched++; 

我可以使用pmtsched ++在C#中更新結構嗎?

+0

難道你不能只是運行代碼,看看你是否得到相同的結果? –

+0

我如何運行它,如果我沒有完成指針...除非在C#中不需要指針?因此,你可能已經回答了我的問題 – Master

回答

2

它看起來像你通過對現有結構的列表使用指針運算要麼

  • 迭代,或
  • 創建結構的一個新的列表。

並且這是有效的C.但是,儘管您可以在C#中使用指針,但在unsafe上下文中,它很少是必需的或者是一個好主意。稍微不同的方式:

要創建的新sched_pmt個集合:

List<sched_pmt> payments = new List<sched_pmt>(); 

for(int i = 0; i < numberToCreate; i++) 
{ 
    sched_pmt pmt = new sched_pmt(); 

    pmt.period_number = s++; 
    pmt.interest = pmt_int; 
    pmt.principal = prin; 
    pmt.advanced_pmt = adv_pmt; 
    pmt.total_pmt = pmt + adv_pmt; 
    pmt.balance = pv; 

    payments.add(pmt); 
} 

後來,到遍歷列表:

foreach(var pmt in payments) 
{ 
    /// do something with this pmt.  
} 

或者,只使用一個for循環。它稍微更冗長,但也(非常)更有效一些。

或者,如果你已經有名單,只是想在其中更新的對象,

for(int i = 0; i < payments.Count; i++) 
{ 
     sched_pmt pmt = payments[i]; 

     pmt.period_number = s++; 
     pmt.interest = pmt_int; 
     pmt.principal = prin; 
     pmt.advanced_pmt = adv_pmt; 
     pmt.total_pmt = pmt + adv_pmt; 
     pmt.balance = pv; 
} 

,想到另外一個問題:你是如何創建最初的集合,在你的榜樣,你」試圖通過遞增指針來迭代?如果它在一個數組中,你很可能做錯了。

3

我建議你它在C#不只是轉換它,因爲不同的語言遵循不同的方式來做事情。我的意思是寫在面向對象的方式(可能不適合此代碼),但它將有助於可擴展性,靈活性等。

如果你設定你的目標在c#中獲得相同的功能,而不是隻是轉換,那麼一切都變成簡單。

btw回答你的問題是是c# supports pointers在不安全的情況下;你可以使用它們,如果這是你以後的事情。

1

看起來你的C代碼使用了一個指向(不安全)的指針來移動數組或類似的數據結構。如果是這樣的話,爲什麼不只是做

foreach(sched_pmt pmt in pmtList) 
{ 
    pmt.period_num = s++; 
    pmt.interest = pmt_int; 
    pmt.principal = prin; 
    pmt.advanced_pmt = adv_pmt; 
    pmt.total_pmt = pmt + adv_pmt; 
    pmt.balance = pv; 
} 

更妙的是,你可以做一個函數,它所有的PARAMS(S,pmt_int等),並相應地更新PMT。你可以只寫這樣

foreach(sched_pmt pmt in pmtList) 
{ 
    pmt.Update(//params go here); 
} 
+0

我想創建一個ObservableCollection pmtlist 並做pmtlist.add(PMT)每次添加到列表中?聽起來像正確的方向 – Master

+0

@ user3276954爲什麼'ObservableCollection <>'而不只是一個'List <>'?在什麼情況下使用? –

+0

@ user3276954是的,這正是你要做的(用任何列表數據結構)。雖然爲什麼ObservableCollection特別? – SomeGuy