2014-01-20 55 views
2

我有一個價格矩陣列表,我存儲的寬度,長度和價格的項目。我想從輸入寬度和長度中找到最大的寬度和高度。例如,比方說,如何使用LINQ從列表<Price>獲取最接近的數字?

Public Class ItemPrice 
{ 
public int id{ get; set; } 
public string item{ get; set; } 
public int width{ get; set; } 
public int height{ get; set; } 
public decimal price{ get; set; } 
} 

List<ItemPrice> itemorder = new List<ItemPrice>(); 
itemorder.Add(new ItemPrice(1,"A",24,12,$12.24)); 
itemorder.Add(new ItemPrice(2,"A",24,14,$16.24)); 
itemorder.Add(new ItemPrice(3,"A",36,12,,$18.24)); 
itemorder.Add(new ItemPrice(4,"A",36,14,$21.24)); 

這意味着它看起來像

 24  36 
-------------------- 
12 | $12.24 $18.24 
14 | $16.24 $21.24 

我怎樣才能找到ITEMPRICE ID 4作爲寬度= 30高度= 13的結果?以及如果寬度= 40和高度= 16如何返回空值?

+0

請確切地說明H en W.的順序。發佈該構造函數的第一行。 –

+0

@HenkHolterman:我只想知道背後的邏輯,所以這就是爲什麼我沒有在我的問題中寫入構造函數。 –

+0

W = 10,H = 26應該返回什麼?而對於W = 10,H = 10? –

回答

1

這應該爲你做它:

// Change these as needed 
int orderWidth = 1; 
int orderHeight = 1; 

var bestMatch = (from item in itemorder 
       where item.width >= orderWidth 
       where item.height >= orderHeight 
       orderby item.width * item.height 
       select item).FirstOrDefault(); 

這LINQ查詢過濾出的大小小於大小排序的所有項目。然後按升序排列剩餘的項目。最後,它會選擇第一個項目(==最小項目),或者爲null。

編輯

下面是根據每個項目的兩側的總和更新的解決方案。

int orderWidth = 4; 
int orderHeight = 4; 

int orderSum = orderWidth + orderHeight; 

var bestMatch = (from item in itemorder 
       where item.width >= orderWidth 
       where item.height >= orderHeight 
       let itemSum = item.width + item.height 
       let difference = Math.Abs(orderSum - itemSum) 
       orderby difference 
       select item).FirstOrDefault(); 
+0

謝謝..它只是我想要的方式。 –

+1

該解決方案有可能返回尺寸不佳的解決方案。比如說,你有兩個矩形 - 5 x 1,000和6 x 7 - 如果你正在尋找一個大於4 x 4的矩形,那麼5 x 1,000會被返回,或許6 x 7會更好比賽。 'orderby'行可能更好地表示爲'orderby item.width * item.height',因爲這將返回最接近的匹配大小。 – Enigmativity

+0

@Enigmativity這很瘋狂,你只是通過查看我的代碼來解決這個問題嗎?驚人。 –

相關問題