C# 从命名集合MVC中提取键值对

C# 从命名集合MVC中提取键值对,c#,asp.net-mvc,formcollection,C#,Asp.net Mvc,Formcollection,我从松散绑定的razor表单中提取表单值。我不使用强绑定模型的原因是支付值字段和类别是动态的 到达控制器的表单集合数组如下所示: Payment {"1":"120","4":"23","6":"12","8":"120","9":"100"} 我需要像这样拆分数组(当PayCatId=1,Pay=120)(当PayCatId=4,Pay=23)等等 然后我尝试使用下面的逻辑保存到数据库 for (var i = 0; i < pa.Length; i++) { payment.

我从松散绑定的razor表单中提取表单值。我不使用强绑定模型的原因是支付值字段和类别是动态的

到达控制器的表单集合数组如下所示:

Payment {"1":"120","4":"23","6":"12","8":"120","9":"100"}
我需要像这样拆分数组(当PayCatId=1,Pay=120)(当PayCatId=4,Pay=23)等等

然后我尝试使用下面的逻辑保存到数据库

for (var i = 0; i < pa.Length; i++)
{
    payment.Pay = Convert.ToDecimal(pa[i]);                 
    payment.PayCatId = Convert.ToInt32(pa[i]);  (added:how do i get this value from pair?)
    payment.PayDate = DateTime.Now;
    db.Payments.Add(payment);
    db.SaveChanges();
 }
for(变量i=0;i
删除了错误位,因为我被告知该方法不适用
我还想知道这是否是实现这一目标的正确和可靠的方法。

您可以使用Split、Select和ToDictionary的组合来实现这一点,请参阅代码:

var srt = "\"1\":\"120\",\"4\":\"23\",\"6\":\"12\",\"8\":\"120\",\"9\":\"100\"";

srt.Split(',')
    .Select(x => x.Split(':'))
    .ToDictionary(x => int.Parse(x[0].Replace("\"","")), x => int.Parse(x[1].Replace("\"","")))


/*
    Output: 
    Dictionary<int, int>(5) 
    { 
        { 1, 120 }, 
        { 4, 23 }, 
        { 6, 12 }, 
        { 8, 120 }, 
        { 9, 100 } 
    }
*/
var srt=““1\”:“120\”,“4\”:“23\”,“6\”:“12\”,“8\”:“120\”,“9\”:“100\”;
srt.Split(',')
.Select(x=>x.Split(':'))
.ToDictionary(x=>int.Parse(x[0]。替换(“\”,”),x=>int.Parse(x[1]。替换(“\”,”))
/*
输出:
字典(5)
{ 
{ 1, 120 }, 
{ 4, 23 }, 
{ 6, 12 }, 
{ 8, 120 }, 
{ 9, 100 } 
}
*/

只需一次循环两个步骤,而不是一个步骤

for (var i = 0; i < pa.Length; i+=2)
{
    payment.Pay = Convert.ToDecimal(pa[i]);                 
    payment.PayCatId = Convert.ToInt32(pa[i+1]);
    payment.PayDate = DateTime.Now;
    db.Payments.Add(payment);
    db.SaveChanges();
 }
for(变量i=0;i
谢谢@AlbertoMonteiro没过多久我就意识到我需要你的代码贡献too@Diin我很高兴我的贡献是有用的
for (var i = 0; i < pa.Length; i+=2)
{
    payment.Pay = Convert.ToDecimal(pa[i]);                 
    payment.PayCatId = Convert.ToInt32(pa[i+1]);
    payment.PayDate = DateTime.Now;
    db.Payments.Add(payment);
    db.SaveChanges();
 }