2016-09-21 3 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

Отдельный класс с хорошо известными свойствами (которые вы уже используете) i s в настоящее время наиболее читаемый способ сделать это.

В 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 

Это не будет доступно до некоторого времени в следующем году.

Кроме того, несмотря на то, что эта новая поддержка кортежа делает более удобным WRITE код, он не позволяет вам документировать его, используя комментарии 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

Хороший ответ, но я бы расширил этот метод, чтобы вернуть bool, когда он может быть разобран/указывает, что значения 'out' действительны. Как и 'int.TryParse()' и т. Д. –

+0

@JeroenvanLangen Отличное предложение, я обновил ответ – sly

Смежные вопросы