2014-04-28 95 views
0

即时通讯产品列表中的ExpandoObject列表有一个可怕的问题,我无法使用产品列表中的普通类别原因,有些产品使用尺寸作为数字(20,21 ,22 ...),其他作为字母(S,M,L,XL ....)我把这个在网格上,在每个尺寸列中,我把每个商店从供应商处收到的数量ExpandoObject性能不佳

这是我的名单:

listaGrade = new List<dynamic>(); 

foreach(product p in BD.Proc) 
{ 
    foreach(store s in BD.Stores) 
    { 
     dynamic itemGradeDinamic = new ExpandoObject(); 

     itemGradeDinamic.MODELDES = p.MODELDES; 
     itemGradeDinamic.TIPO = p.TIPO; 
     itemGradeDinamic.DESCRIPTION = p.DESCRIPTION; 
     itemGradeDinamic.STORE = s.CODE; 
     itemGradeDinamic.STOREDES = s.NAME; 
     itemGradeDinamic.SUBTOTAL = 0; 

     foreach (string size in p.sizes) 
     { 
      ((IDictionary<String, Object>)itemGradeDinamic).Add(size, 0); 
     } 
     listaGrade.add(itemGradeDinamic); 
    } 
} 

获取数据:

object description, modelDes = ""; 
object qtde, store = 0; 
foreach (ExpandoObject obj in listaGrade) 
{ 
    foreach (string size in "products".sizes) 
    { 
     if (((IDictionary<string, object>)obj).TryGetValue(size, out qtde)) 
     { 
      if (Convert.ToDecimal(qtde) > 0) 
      { 
       ((IDictionary<string, object>)obj).TryGetValue("DESCRIPTION", out description); 
       ((IDictionary<string, object>)obj).TryGetValue("MODELDES", out modelDes); 
       ((IDictionary<string, object>)obj).TryGetValue("TIPO", out tipo); 
          ((IDictionary<string, object>)obj).TryGetValue("SHOP", out store); 

      } 
     } 
    } 
}  
+1

这里的技巧是不使用ExpandoObject。它并不意味着你可以用于一切的通用类型。这是针对动态对象是唯一选项的代码部分。为什么你不能简单地将大小存储为一个字符串?这将很容易处理大小20,21等。 –

+2

“我不能使用正常的类别原因即时通讯使用产品清单,有些产品使用大小作为数字(20,21,22 ...),其他作为字母(S ,M,L,XL ....)“ - 为什么不使用'object'或'string'来处理这两种情况?在性能方面,使用'ExpandoObject'会让你付出代价。 –

+0

糟糕的选择导致糟糕的表现。正如其他人之前所写,清理对象层次结构。 –

回答

0

ExpandoObject不会替换静态类型。在这种特殊情况下,您必须放弃ExpandoObject,转而使用自定义静态类。如果您需要包含动态数据结构的内容,请使用Dictionary或Dictionary。取决于任务...

+0

静态类与静态类型对象不同。 –

+0

我是C#新手,不知道许多命令,以及如何辨别更好的代码以及如何执行多次,这是[GRID](http://imageshack.com/a/img836/3528/1m3s .png)我在WPF中使用。 你能解释我更好的方法吗? – darterevoltz