2017-10-20 14 views
1

說返回的字符串獲取元組,我們有代碼:從Tuple.ToString()

var tuple = new Tuple<double, int>(10.6, 2); 
var tupleString = tuple.ToString(); //returns "(10.6, 2)"; 

我們可以從tupleString一個新的元組實例,無需執行任何自定義解析器和JsonConverters和擴展類型轉換器?

更新1
在我的生產代碼,我有SortedList<Tuple<DayOfWeek, double>, double>。該列表由Json.NET序列化,將Dictionary鍵轉換爲.ToString()。然後JSON被髮送到前端應用程序。然後前端應用程序向該服務器發送具有該序列化密鑰的請求。我必須將該密鑰轉換爲.NET Tuple,但我不知道該怎麼做。

+0

你是否假設只有'double,int'的元組需要從字符串中重構?在* general *中,不能保證通過在各個元組組件上調用'ToString()'創建的字符串包含足夠的信息來重新創建原始數據類型。如果你想*序列化*,你應該尋找序列化機制,而不是'ToString'。 –

+0

@Damien_The_Unbeliever,我更新了我的問題。 – Wladyslaw

回答

4

當然可以。你可以'簡單'解析輸出字符串,但我希望你喜歡編寫解析算法,然後可能會變得很難,尤其是當它涉及字符串和對象時...尤其是當它涉及字符串和對象時...

請參閱例如這一個,這是無法解析的:

var tuple = new Tuple<string, int>("10, 6", 2); 
var tupleString = tuple.ToString(); //returns "(10, 6, 2)"; 

我會建議使用項目的元組本身,而不是做一個串出來的第一:

Tuple<int> tuple2 = tuple.Item2; 

如果您正在使用JSON.NET序列化,你應該寫或使用自定義序列化程序,如the one mentioned here

+1

我的感覺正好。這是可能的,但不值得花時間和精力。 –

0

我用另一種方式解決了我的問題,使用Nate Barbettini的this答案。 我改變了他的代碼是:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     Type type = value.GetType(); 
     IEnumerable keys = (IEnumerable)type.GetProperty("Keys").GetValue(value, null); 
     IEnumerable values = (IEnumerable)type.GetProperty("Values").GetValue(value, null); 
     IEnumerator valueEnumerator = values.GetEnumerator(); 

     writer.WriteStartObject(); 
     foreach (object key in keys) 
     { 
      valueEnumerator.MoveNext(); 
      writer.WritePropertyName(JsonConvert.SerializeObject(key)); 
      serializer.Serialize(writer, valueEnumerator.Current); 
     } 
     writer.WriteEndObject(); 
    } 

然後,只需設置自定義JsonConverterAttribute所需的IDictionary <,>和Json.NET將JsonConvert.SerializeObject(),而不是.ToString()序列化的鍵。所以Tuple可以被Json.NET正確地反序列化。