2015-05-26 66 views
2

比方說,我有,爲每個產品選擇最後一個不可空項目?

class Product 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public int Order {get; set;} 
} 

和我的數據有,每Product.Id名稱的

products[0] = new Product { Id = 1, Name = "P1", Order = 1 }; 
products[1] = new Product { Id = 1, Name = "P2", Order = 2 }; 
products[2] = new Product { Id = 1, Name = null, Order = 3 }; 
products[3] = new Product { Id = 2, Name = "P3", Order = 4 }; 
products[4] = new Product { Id = 2, Name = null, Order = 5 }; 
products[5] = new Product { Id = 2, Name = null, Order = 6 }; 

我需要的是最後一個(順序按訂單DESC),不可爲空值。所以,我的最終輸出將是什麼樣子,

items[0] = new { Id = 1, Name = "P2"}; 
items[1] = new { Id = 2, Name = "P3"}; 

如果Id=1,我有3名(P1P2null)和非空的名稱(P1P2),但最後一個是P3

+1

你是什麼意思與*最後*。你是否認爲每個'Id'最後一個? –

+0

CommuSoft,是每個ID的最後一個。 BrokenGlass我也在嘗試。 – user960567

回答

4

這應該得到最後的產品才能。

var lastOrders = products 
     .Where(x => x.Name != null) // Remove inapplicable data 
     .OrderBy(x => x.Order) // Order by the Order 
     .GroupBy(x => x.Id) // Group the sorted Products 
     .Select(x => x.Last()); // Get the last products in the groups 
+0

這工作正常謝謝。 – user960567

0

該任務可以使用下面的Linq語句來解決。

var Result = products.OrderBy().Where(null != iProduct.Name).First(); 

這需要products包含至少一個項目,其中Namenull,否則Exception將被拋出。另外,

var Result = products.OrderBy().Where(null != iProduct.Name).FirstOrDefault(); 

將返回null如果products中沒有這樣的項目。

+1

我的意思是每個Id看到我的預期結果 – user960567

0

與嘗試:

var expectedProduct =products.Where(p => p.Id != null).OrderByDescending(p => p.Order).GroupBy(p => p.Id).Last() 
+0

沒有不工作 – user960567

+0

您的預期產出是什麼? –

+0

檢查問題。 – user960567

1
var result = products 
       .GroupBy(p => p.Id) 
       .Select(g => g.OrderBy(x => x.Order).Last(x => x.Name != null)); 
1

這會給你你需要的輸出:

products.GroupBy(p => p.Id) 
     .Select(g => g.OrderByDescending(gg => gg.Name) 
         .Where(gg => gg.Name != null) 
         .Select(gg => new { gg.Id, gg.Name }) 
         .First()); 
相關問題