2016-05-05 46 views
2

首先我對LINQ很陌生。更新列表<T>通過自我加入?

我有有數據像這樣的列表:

列表

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在這裏是標識因素。

類:

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; } 
    } 
+0

你有沒有嘗試過自己?特別是在任何地方卡住?此外,您的結果與您之前描述的不同 - 「期望的結果」已刪除空條目,而描述表明您希望保留它們,並複製丟失的信息 – Andrei

+0

如果顯示T類,則會很有用 –

+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將betaken(但是這可以根據需要而改變)。
  2. 根據您的示例,id,block用於對列表項進行分組。
+0

我試過你的解決方案,但它似乎並沒有改變名單。即使經過它,價值也是如此。 – Arbaaz

+0

它創建新的'List',因此將其分配回相同的列表。 –

+0

@Laq中的@Arbaaz,Q代表「查詢」。 Linq不會更改列表,它旨在查詢它們並創建新列表 – Andrei