2015-02-09 16 views
-3

發現在(串)最大(INT)值列我有一欄是這樣的:與LINQ

sNumber   Value (String) 
A    10 
b    50 
c    90 
d    Hi 
e    !!! 
f    #123 

我想搜索的是90最大的值,然後遞增1

在搜索時,我想忽略「Hi」和任何包含字符。

我成功地將數字增加1到數據類型int列。 這是下面的代碼。

var sQuery = 
    (from staff in db.Staffs where staff.sNumber >= 0 
    orderby staff.sNumber ascending select staff.sNumber) 
    .Distinct().ToList(); 

int counter = sQuery .Count; 
snumber = sQuery [counter - 1]; 
dmlist.sNumber = snumber + 1; 

此外,我能夠編寫MS SQL查詢的代碼來找出我的目標結果。 但無法將其轉換爲LINQ。

SELECT Convert(BIGINT, sNumber) As sNumber 
    FROM DATABASE_NAME 
    WHERE ISNUMERIC(sNumber) > 0 
    ORDER BY sNumber desc 

是否有人可以指導我將此MS SQL查詢轉換爲LINQ或更好的想法,只獲得數字結果?

回答

4
 List<String> column = new List<string>() 
     { 
      "12", "abc", "99", "!", "654" 
     }; 

     var data = column.Where(x => 
     { 
      decimal temp; 
      return decimal.TryParse(x, out temp); 
     }).Max(x => Convert.ToDecimal(x)); 
     data++; 

不幸的是,如果你想在LINQ查詢中做到這一點,你需要解析兩次。你將首先得到一個有效的值列表。然後,您需要根據每個轉換爲值類型的有效項目獲取最大值。然後,您可以根據需要修改該值。

UPDATE -

這是另一種選擇。你可以遍歷每一個轉換它的項目。任何不能轉換的項目只會將它們設置爲NULL,然後消除它們,然後查找最大值並將其增加。

 Func<string, decimal?> stringToNullableDecimal = s => 
     { 
      decimal temp; 
      if (decimal.TryParse(s, out temp)) 
      { 
       return temp; 
      } 
      return null; 
     }; 
     List<string> column = new List<string>() 
     { 
      "12", "abc", "99", "!", "654" 
     }; 
     var data = column.Select(x => stringToNullableDecimal(x)).Where(x => x.HasValue).Max(); 
     data++; 
+0

這比使用則IsNumeric其中有太多的洞是準確的好得多。做得好。 – 2015-02-09 22:05:04

+0

對於只有負值與其他字符串混合的邊緣情況,如果解析失敗,我會返回'decimal.MinValue'。 – 2015-02-09 22:36:35

0

如圖這樣你就只需要到無法使用的ToString()和你的第一個參數可以保持物體在其原始形式下面你可以做到這一點也能夠通過創造的Object列表而不必通過包裝他們周圍""改變Int32值的字符串結果產生91

var maxList = new List<object> 
{ 
    10, 
    50, 
    90, 
    "Hi", 
    "!!!", 
    "#123" 
}; 

var incData = maxList.Where(m => 
{ 
    decimal temp; 
    return decimal.TryParse(m.ToString(), out temp); 
}).Max(m => Convert.ToDecimal(m)); 
incData++;