提问者:小点点

如何在列表中循环遍历匿名类型的属性


如果我有以下LINQ查询:

 var outstandingDataTotalData = from t1 in dtTotal.AsEnumerable()
                                                  join t2 in dtOutstandingData.AsEnumerable() on
                                                   new
                                                   {
                                                       priv_code = t1["priv_code"],
                                                       pri_ded = t1["pri_ded"].ToString().Trim()
                               
                                                   } equals
                                                     new
                                                     {
                                                         priv_code = t2["priv_code"],
                                                         pri_ded = t2["pri_ded"].ToString().Trim()
               
                                                     }
                                                   into ps
                                                   from t2 in ps.DefaultIfEmpty()
                                                   select new
                                                   {
                                                       adjustment_value = t2 == null ? string.Empty : t2["adjustment_value"].ToString(),
                                                       amount_outstanding = t2 == null ? string.Empty : t2["amount_outstanding"].ToString(),
                                                       amount_outstanding_priv = t2 == null ? string.Empty : t2["amount_outstanding_priv"].ToString(),
                                                       amount_outstanding_ded = t2 == null ? string.Empty : t2["amount_outstanding_ded"].ToString(),
                                                       diff_outstanding = t2 == null ? string.Empty : t2["diff_outstanding"].ToString(),
                                                       exchange_rate = t2 == null ? string.Empty : t2["exchange_rate"].ToString(),
                                                       SalYear = t2 == null ? string.Empty : t2["sal_year"].ToString(),
                                                       SalMonth = t2 == null ? string.Empty : t2["sal_mon"].ToString()
                                                   };

现在OutstandingDataTotalData是匿名类型的列表。 我的课程如下:

 public class AdjustmentTotal
    {
        public string SalYear { get; set; }

        public string SalMonth { get; set; }

        public string Value { get; set; }
    }

如何循环OutstandingDataTotalData属性以填充List,如下例所示:

如果OutstandingDataTotalData=

[0]{ adjustment_value = "100.00", amount_outstanding = "80.00", amount_outstanding_priv = "60.00", amount_outstanding_ded = "30.52", diff_outstanding = "0.36", exchange_rate = "", SalYear = "2018", SalMonth = "1" }

[1]{ adjustment_value = "1500.00", amount_outstanding = "5040.00", amount_outstanding_priv = "", amount_outstanding_ded = "", diff_outstanding = "0.36", exchange_rate = "", SalYear = "2018", SalMonth = "1" }

我希望list的结果集为:

2018  1   100.00
2018  1   1500.00
2018  1   80.00
2018  1   5040.00
2018  1   60.00
2018  1   
2018  1   30.52
2018  1   
2018  1   0.36
2018  1   0.36
2018  1
2018  1   

共3个答案

匿名用户

让你的生活变得轻松,不要提取分离属性。 将提取作为数组:

select new {
  someArray = new[]{
    t2["adjustment_value"].ToString(),
    t2["amount_outstanding"].ToString(),       
    t2["amount_outstanding_priv"].ToString(),
    t2["amount_outstanding_ded"].ToString(),
    ...
  },
  SalYear = ...,

}

这样就得到了一个具有3个属性的对象,两个字符串SalXxx和一个字符串数组(其他值)。 字符串数组意味着您可以使用LINQ SelectMany将其扁平化。 您将在msdn示例中看到,他们拥有宠物列表的主人(宠物的数量可变,但您的值是固定的),在selectmany之后,它被扁平化为一个列表,其中主人重复了一个宠物。 您的小写值是宠物,SalXxx值是所有者

一旦得到一个有效的查询,就可以将其集成到第一个查询中。

很抱歉,没有发布完整的示例(为了清楚起见,我跳过了空检查)--在手机上处理这些代码非常困难

匿名用户

outstandingDataTotalData.Select(s => new AdjustmentTotal {
    SalYear = s.SalYear,
    SalMonth = s.SalMonth,
    Value = s.adjustment_value
}).ToList();

匿名用户

使用eum:

    class Program
    {

        static void Main(string[] args)
        {


            List<AdjustmentTotal> totals = new List<AdjustmentTotal>();
            for (int i = 0; i < (int)VALUE.END; i++)
            {
                foreach (var data in outstandingDataTotalData)
                {
                    AdjustmentTotal total = new AdjustmentTotal();
                    totals.Add(total);
                    total.SalMonth = data.SalMonth;
                    total.SalYear = data.SalYear;
                    total._Type = (VALUE)i;
                    switch ((VALUE)i)
                    {
                        case VALUE.adjustment_value :
                            total.Value = data.adjustment_value;
                            break;
                        case VALUE.amount_outstanding:
                            total.Value = data.amount_outstanding;
                            break;
                        case VALUE.amount_outstanding_ded:
                            total.Value = data.mount_outstanding_ded;
                            break;
                        case VALUE.amount_outstanding_priv:
                            total.Value = data.amount_outstanding_priv;
                            break;
                        case VALUE.diff_outstanding:
                            total.Value = data.diff_outstanding;
                            break;
                        case VALUE.exchange_rate:
                            total.Value = data.exchange_rate;
                            break;
                    }
                }
            }
        }
    }
    public enum VALUE
    {
        adjustment_value = 0, 
        amount_outstanding = 1, 
        amount_outstanding_priv = 2, 
        amount_outstanding_ded = 3, 
        diff_outstanding = 4, 
        exchange_rate = 5,
        END = 6
    }    
    public class AdjustmentTotal
    {
        public string SalYear { get; set; }

        public string SalMonth { get; set; }

        public string Value { get; set; }

        public VALUE _Type { get; set; }
    }