2016-09-21 1 views
0

文字列をさまざまなビットに解析し、それらを返すための読みやすい方法が必要なことがよくあります。静的関数からフィールドを返す簡単な方法はありますか?

私はこのアプローチを好むが、それはUtils.csでは、特定のクラス

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

の作成が含ま:

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

を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それは本当に素晴らしいことではありません。それを使わないでください。コンパイラは戻り値のプロパティに古い名前を使用させます。間違っているとコンパイル時にエラーが発生します。また、実行時にコンパイラを使用して '動的'のコードを生成します。 –

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

また、MSDNの記事out (C# Reference)参照、参照によって引数を渡すoutキーワードを使用することができますコメントからの提案でを更新し

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 = ""; 
    } 
} 

:今後のC#のでは

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

良い答えですが、このメソッドを拡張して、解析可能なときにboolを返します。/ out値が有効であることを示します。 'int.TryParse()'のように –

+0

@JeroenvanLangen優秀な提案、私は答えを更新しました – sly

関連する問題