2011-02-09 27 views

Odpowiedz

77

Użyj metody ToDictionary:

Dictionary<string, string> dString = dObject.ToDictionary(k => k.Key, k => k.Value.ToString()); 

Tutaj ponownie użyć klucza z oryginalnego słownika i konwertować wartości do ciągów wykorzystujących metodę toString.

Jeśli słownik może zawierać wartości null należy dodać null sprawdzenie przed wykonaniem ToString:

Dictionary<string, string> dString = dObject.ToDictionary(k => k.Key, k => k.Value == null ? "" : k.Value.ToString()); 

Powodem tego jest to, że działa Dictionary<string, object> jest rzeczywiście IEnumerable<KeyValuePair<string,object>>. Powyższy przykład kodu iteruje poprzez przeliczalne i buduje nowy słownik przy użyciu metody ToDictionary.

Edit:

w .NET 2.0 nie można użyć metody ToDictionary, ale można osiągnąć to samo przy użyciu dobrej staromodny foreach:

Dictionary<string, string> sd = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, object> keyValuePair in dict) 
{ 
    sd.Add(keyValuePair.Key, keyValuePair.Value.ToString()); 
} 

Edit2:

Jeśli korzystasz z .Net 2.0 i możesz mieć wartości puste w słowniku, poniższe elementy powinny być bezpieczne:

Dictionary<string, string> sd = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, object> keyValuePair in dict) 
{ 
    sd.Add(keyValuePair.Key, keyValuePair.Value == null ? "" : keyValuePair.Value.ToString()); 
} 
+0

Używam .NET 2.0, jest możliwe w nim. Nie otrzymuję "ToDictionary" –

+0

@Rune: Czy 'k.Value.ToString()' zwraca zawsze to samo, co '(string) k.Value'? –

+0

@Oscar: Nie. (Ciąg) k.Value nie powiedzie się, jeśli wartość jest obiektem nie będącym ciągiem. Funkcja ToString() jest bezpieczna dla wszystkich wartości innych niż NULL. –

2

Jak o:

Dictionary<string, string> newDictionary = dObject.ToDictionary(k => k.Key, k => (string) k.Value); 
+0

Nie powiedzie się, jeśli słownik zawiera wartości inne niż łańcuchowe. Na przykład nie można przekonwertować int na ciąg znaków. –

+0

Po pierwsze używam .NET 2.0, jest możliwe w nim. Nie otrzymuję metody "ToDictionary". –

+0

Cóż, przypuszczam, że jeśli chce to zrobić, to dlatego, że słownik zawiera 'łańcuchy', ale tak czy owak, to jest poprawne. –

5

.NET 3.5:

Dictionary<string, string> result = dObject.ToDictionary(kvp => kvp.Key, kvp => Convert.ToString(kvp.Value)); 

.NET 2.0:

Dictionary<string, string> result = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, object> kvp in dObject) result.Add(kvp.Key, Convert.ToString(kvp.Value)); 
4

Ponieważ używasz .NET 2.0:

Dictionary<string, string> dString = new Dictionary<string, string>(); 

foreach (KeyValuePair<string, object> item in dObject) 
{ 
    dString.Add(item.Key, item.Value.ToString()); 
    //here item.Value.ToString() is an example 
    //you should convert your item to string according to the requirement 
} 
+0

Co się dzieje, jeśli są w nim wartości NULL? –

+3

@MKS: Dlatego mówię "skonwertuj element do łańcucha zgodnie z wymaganiem", na przykład możesz użyć 'string.Empty' dla wartości pustych lub łańcucha" NULL "dla wartości pustych ... wszystko zależy na wymaganie. –

+0

Czasami w kluczu mogą znajdować się wartości zerowe, proszę zasugerować, jak go przekonwertować? –

1

w .NET 2.0 prawdopodobnie najlepszym przyjacielem jest foreach pętla:

Dictionary<string, object> dObject = new Dictionary<string, object>(); 
Dictionary<string, string> newObjects = new Dictionary<string, string>(); 

foreach (KeyValuePair<string, object> keyValuePair in dObject) 
{ 
    newObjects.Add(keyValuePair.Key, keyValuePair.Value.ToString()); 
} 
0
Dictionary<string, string> dString = dObject.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString()); 

To tylko pomysł. Możesz wstawić wszelkie weryfikacje.

Powiązane problemy