转换数据结构

  • 本文关键字:数据结构 转换 c# c
  • 更新时间 :
  • 英文 :


我遇到了转换少量代码的困难。如果我能得到一些指导,那就太好了。代码当前为 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# 中以相同的方式更新结构吗?

我建议你用c#编写它,不要只是转换它,因为不同的语言遵循不同的做事方式。我的意思是以面向对象的方式编写它(可能不适合此代码),但它将有助于可扩展性、灵活性等。

如果您的目标是在 c# 中获得相同的功能,而不仅仅是转换,那么一切都变得容易了。

顺便说一句,对你的问题的回答是肯定的,C#在不安全的上下文中支持指针;如果你想要的话,你可以使用它们。

看起来您正在使用指针算术

  • 循环访问现有结构的列表,或
  • 创建一个新的结构列表。

这是有效的 C。但是,尽管可以在unsafe上下文中使用 C# 中的指针,但这很少是必需的或好主意。略有不同的方式:

要创建新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;  
}

我想到的另一个问题:如何创建初始集合,在您的示例中,您尝试通过增加指针来循环访问?如果它在数组中,你很可能做错了。

看起来您的 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;
}

更好的是,你可以创建一个函数来获取所有参数(s、pmt_int等)并相应地更新 pmt。这样你就可以写

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

最新更新