日期:2014-05-20  浏览次数:21215 次

linq to List<T>分组求和

  public class CaigouTable
        {
            public string pSku { get; set; }//SKU
            public string ChineseName { get; set; }//中文名称
            public Hashtable Quantity { get; set; }//数量
            public ArrayList OrderIDs { get; set; }//订单来源_订单号
        }
//测试添加数据
List<CaigouTable> list=new List<CaigouTable>();
for(int i=1;i<3;i++)
{
CaigouTable  ct=new CaigouTable();
Hashtable htProperty = new Hashtable();  
ArrayList orderIDs = new ArrayList();
ct.pSku="111";
ct.ChineseName ="aa";
htProperty.Add("test", 1);
ct.Quantity = htProperty;
orderIDs.Add("a_111");
ct.OrderIDs = orderIDs;
list.add(ct);
}
想要根据相同的pSku,Quantity.key合并数据,Quantity.value相加,其他不变
最后的结果就是
111
aa
test   2
a_111,a_111

 var query = from c in list
                        group c by new { c.pSku } into g
                        select new
                        {
                            sku = g.Select(p => p.pSku).First(),
                            name = g.Select(p => p.ChineseName).First(),
                           // Quantity =
                           // OrderIDs = 
                        };
 少个条件,还有注释的地方不会写,不知道hashtables内的key是否可以作为条件,这个hashtables只有一条数据,固定死的。
如果hashtable不能做条件/或者不知道怎么写,可以去掉Quantity.key这个条件
主要是下面注释的地方怎么写



------解决方案--------------------
本帖最后由 q107770540 于 2013-05-16 21:11:06 编辑

//你的类结构设计的太蛋疼了
void Main()
{
//测试添加数据
List<CaigouTable> list=new List<CaigouTable>();
for(int i=1;i<3;i++)
{
CaigouTable  ct=new CaigouTable();
Hashtable htProperty = new Hashtable();  
ArrayList orderIDs = new ArrayList();
ct.pSku="111";
ct.ChineseName ="aa";
htProperty.Add("test", 1);
ct.Quantity = htProperty;
orderIDs.Add("a_111");
ct.OrderIDs = orderIDs;
list.Add(ct);
}

var query = from c in list
group c by new { c.pSku,c.Quantity.Cast<DictionaryEntry>().First().Key} into g
select new
{
sku = g.Key.pSku,
name = g.Select(p => p.ChineseName).First(),
    Quantity =new {Key=g.Key.Key, value=g.Sum(x=>x.Quantity.Cast<DictionaryEntry>().Sum(y=>(int)y.Value))},
    OrderIDs = string.Join(",",g.SelectMany(x=>x.OrderIDs.ToArray().Select(y=>y.ToString()).ToArray()).ToArray())
};

}
 public class CaigouTable
{
public string pSku { get; set; }//SKU
public string ChineseName { get; set; }//中文名称
public Hashtable Quantity { get; set; }//数量
public ArrayList OrderIDs { get; set; }//订单来源_订单号
}