通过自联接更新列表<t>?

时间:2016-05-05 11:30:10

标签: c# asp.net .net linq generics

首先,我对LINQ很新。

我有一个包含以下数据的列表:

列表

 list[0] = id=1,block=10,sg=320,dc=null

 list[1] = id=1,block=10,sg=null,dc=320

 list[2] = id=2,block=15,sg=400,dc=null

 list[3] = id=2,block=15,sg=null,dc=400

我想更新此列表,以便:

if(sg where block=x  and id=y  is null) 
then set sg = (sg where block=x  and id=y  is not null) 
and similarly for dc

期望的结果:

 list[0] = id=1,block=10,sg=320,dc=320 

 list[1] = id=2,block=15,sg=400,dc=400

注意:id和block是识别因素。

CLASS:

public  class dcsg
    {
        public long id { get; set; }
        public Nullable<decimal> dcvalue { get; set; }
        public Nullable<decimal> sgvalue { get; set; }
        public Nullable<int> revision { get; set; }
        public Nullable<long> timestampid { get; set; }
        public decimal fuelcost { get; set; }
        public Nullable<short> isdeleted { get; set; }
        public Nullable<long> blockno { get; set; }
        public int stageid { get; set; }
    }

1 个答案:

答案 0 :(得分:2)

您可以使用LinqGroupBy来实现这一目标。

lists = lists.GroupBy(x=> new {x.id, x.blockno})
             .Select(x=> 
              {
                 var sg1 = x.FirstOrDefault(f=>f.sgvalue.HasValue);
                 var dc1 = x.FirstOrDefault(f=>f.dcvalue.HasValue);  
                 return new dcsg() // create class instance if have one.
                 {
                     id= x.Key.id,
                     blockno= x.Key.blockno,
                     sgvalue = sg1==null? null; sg1.sgvalue, 
                     dcvalue = dc1==null? null; dc1.dcvalue,
                     // copy other properties (if needed). 
                 };
              })
             .ToList();  

显然,代码片段有两个假设。

  1. 如果同一个区域出现多个sg,则首先 sg将会进行测试(但这可以根据需要进行更改)。
  2. 根据您的示例,id,block用于对列表项进行分组。