2011-04-13 27 views
1

我寫了這個檢查在C#中執行一些值檢查:將長到LINQ

  if ((x <= 20 && y <= 5) || (x <= 30 && y <= 10) || 
      (x <= 50 && y <= 15) || (x <= 70 && y <= 20) || 
      (x <= 70 && y <= 30)) 
      { 
       // do something 
       } 

我在這個過程中學習LINQ是的,我想改變上面的代碼使用LINQ ,

如果您提交了一個代碼,您可以添加一些註釋來解釋轉換。

回答

3

如果你真的想使用LINQ,一個辦法是存儲代表每個案件(上界)元組的集合,然後使用Enumerable.Any方法來測試一個(x, y)對滿足任何可能的條件。

例(在現實中,你可以一次創建集合,並給它更長的使用壽命,也許是通過現場參考):

var bounds = new Dictionary<int, int> 
{ 
    {20, 5}, 
    {30, 10}, 
    {50, 15}, 
    {70, 20}, 
    {70, 30} 
}.Select(kvp => new { XUpperBound = kvp.Key, YUpperBound = kvp.Value }); 


if (bounds.Any(tuple => x <= tuple.XUpperBound && y <= tuple.YUpperBound)) 
{ 
    ... 
} 
+0

那麼......移動開銷,時間越長越難讀,所有這些都是爲了使用'Select'語句? – 2011-04-13 13:59:46

+2

@亞當哦來吧。它回答了原來的問題;)+1創造性的答案 – Dolbz 2011-04-13 14:02:01

+0

這絕對是「LINQ在這裏沒有幫助,可以使它變得更醜陋」的例子,而是一個學術問題的有趣解決方案。 – Tom 2011-04-13 14:05:23

2

LINQ與您發佈的代碼沒有任何關係。由於你選擇的數字似乎基本上是任意的,我沒有看到任何進一步減少這種說法的方法。

,使它看起來更好,只是格式化代碼:

if (
    (x <= 20 && y <= 5) || 
    (x <= 30 && y <= 10) || 
    (x <= 50 && y <= 15) || 
    (x <= 70 && y <= 20) || 
    (x <= 70 && y <= 30) 
    ) 
     { 
      // do something 
     } 

這應該使你對明確的,可以很容易地添加條件,同時不增加LINQ的開銷只是使用它的緣故。

+0

好吧,其他任何方式,以提高密碼? – Mark 2011-04-13 14:02:13

+0

@Mark:什麼需要增強?代碼很清楚,儘管'x'和'y'確實是傾斜的變量名。 – 2011-04-13 14:04:40

+0

如果我需要更改要比較的數字,或者需要添加更多對比較,該怎麼辦? – Mark 2011-04-13 14:06:11