2016-09-21 69 views
0

我經常想將一個字符串解析爲不同的位,並且有一個可讀的方式來返回它們。有沒有更簡單的方法來從靜態函數返回字段?

我喜歡這種方法,但它涉及到創建一個特定的類

long orderID = Utils.UnTradeIdent(tradeIdent).OrderID; 

在Utils.cs:

public class TradeIdentData 
    { 
     public string AccountIdent; 
     public long OrderID; 
     public string SubID; 
    } 

    public static TradeIdentData UnTradeIdent(string tradeIdent) 
    { 
     TradeIdentData tradeIdentData = new TradeIdentData(); 

     var parts = tradeIdent.Split('!'); 
     tradeIdentData.AccountIdent = parts[0]; 
     if (parts[1].Contains(".")) 
     { 
      var bits = parts[1].Split('.'); 
      tradeIdentData.OrderID = long.Parse(bits[1]); 
      tradeIdentData.SubID = bits[1]; 
     } 
     else 
     { 
      tradeIdentData.OrderID = long.Parse(parts[1]); 
      tradeIdentData.SubID = ""; 
     } 

     return tradeIdentData; 

    } 
+0

隨着即將到來的C# 7你可以使用內置的元組功能:http://stackoverflow.com/documentation/c%23/1936/c-sharp-7-0-features/6329/language-對元組的支持#t = 201609211453403656236 – Nico

+1

描述你的回報,不是一個壞主意.. –

回答

3

一個單獨的類與命名的屬性(你已經使用)我這是目前最可讀的方式。

在C#7,你將能夠使用元組返回值,就像這樣:

public static (string AccountIdent, string OrderID, string SubID) UnTradeIdent(string tradeIdent) 
{ 
    string accountIdent, orderID, subID ; 

    ... Code to initialise accountIdent, orderID and subID appropriately ... 

    // Now return the data as a tuple:  

    return (accountIdent, orderID, subID); 
} 

可以消耗這個如下:

long orderID = Utils.UnTradeIdent(tradeIdent).OrderID; 

或者,如果你希望所有的值:

var result = Utils.UnTradeIdent(tradeIdent); 
// Use result.OrderId, result.SubID or result.AccountIdent 

儘管如此,直到明年的某個時候纔可以使用。

此外,即使這種新的元組支持使寫入代碼更爲方便,它也不允許您使用XML註釋來記錄它。花時間編寫一個簡單且記錄良好的類仍然會比使用新的C#7元組支持更好。

See here for more details

0

它非常簡單,通過改變返回類型爲動態和使用只是做一個匿名類

public static dynamic UnTradeIdent(string tradeIdent) 
{ 
    var value1 = //parselogic 
    var value2 = //parselogic 
    return new { Identity = value1, Item2 = value2}; 
} 
+0

哇,這太棒了! – ManInMoon

+3

如果不涉及腳本語言,我會避免使用'dynamic'。它通常意味着一個糟糕的設計。沒有編譯時檢查它們,這可能會導致運行時錯誤。 –

+1

@ManInMoon這不是太棒了,它真的不是。不要使用它。編譯器會讓你使用任何舊名稱作爲返回值的屬性,如果它是錯誤的,它會在編譯時給你一個錯誤。它將在運行時使用編譯器生成'dynamic'的代碼。 –

0

我會考慮製作其他靜態方法。當你需要所有返回的屬性時,你當前的實現更清晰,但是當你只需要其中一個時,下面的東西可能是合適的。

public static string TradeIdentToAccountIdent(string tradeIdent) 
{ 
    var parts = tradeIdent.Split('!'); 

    return parts[0]; 
} 

public static long TradeIdentToOrderID(string tradeIdent) 
{ 
    var parts = tradeIdent.Split('!'); 
    if (parts[1].Contains(".")) 
    { 
     var bits = parts[1].Split('.'); 

     return long.Parse(bits[1]); // Taken from your example, should probably be bits[0]? 
    } 
    else 
     return long.Parse(parts[1]); 
} 

// My own take on it this time, you could obviously use your logic as well. 
public static string TradeIdentToSubID(string tradeIdent) 
{ 
    var order = tradeIdent.Split('!')[1]; 

    if (order.Contains(".")) 
     return order.Split('.')[1]; 
    else 
     return String.Empty; 
} 
2

您也可以使用out關鍵字按引用傳遞參數,請參閱MSDN文章out (C# Reference)

public static void UnTradeIdent(string tradeIdent, out string AccountIdent, out long OrderID, out string SubID) 
{ 
    var parts = tradeIdent.Split('!'); 
    AccountIdent = parts[0]; 
    if (parts[1].Contains(".")) 
    { 
     var bits = parts[1].Split('.'); 
     OrderID = long.Parse(bits[1]); 
     SubID = bits[1]; 
    } 
    else 
    { 
     OrderID = long.Parse(parts[1]); 
     SubID = ""; 
    } 
} 

從意見修訂與建議:

public static bool UnTradeIdent(string tradeIdent, out string AccountIdent, out long OrderID, out string SubID) 
{ 
    bool result = false; 
    AccountIdent = ""; 
    OrderID = 0; 
    SubID = ""; 

    try 
    { 
     var parts = tradeIdent.Split('!'); 
     AccountIdent = parts[0]; 
     if (parts[1].Contains(".")) 
     { 
      var bits = parts[1].Split('.'); 
      OrderID = long.Parse(bits[1]); 
      SubID = bits[1]; 
     } 
     else 
     { 
      OrderID = long.Parse(parts[1]); 
      SubID = ""; 
     } 
    } 
    catch(ArgumentNullException ane) 
    { 
     // Handle parsing exception 

    } 
    catch (FormatException fe) 
    { 
     // Handle parsing exception 
    } 
    catch (OverflowException oe) 
    { 
     // Handle parsing exception 
    } 

    return result; 
} 
+1

不錯的答案,但我會擴展這個方法來返回一個布爾當它可以被解析/表明'out'值是有效的。像'int.TryParse()'等 –

+0

@JeroenvanLangen好的建議,我已經更新了答案 – sly

相關問題