Gibt es überhaupt eine praktische Möglichkeit, ein Wörterbuch in einen String zu konvertieren?


75

Ich fand, dass die Standardimplementierung von ToString im Wörterbuch nicht das ist, was ich will. Ich hätte gerne {key=value, ***}.

Irgendein praktischer Weg, um es zu bekommen?


3
Ist dies nur zur Visualisierung im Debugger? Oder soll diese Zeichenfolge dem Benutzer zugewandt sein?
TreDubZedd

1
Ich denke, das ist sehr gut gemacht von JSON Serializer
Shekhar_Pro

Antworten:


109

Versuchen Sie diese Erweiterungsmethode:

public static string ToDebugString<TKey, TValue> (this IDictionary<TKey, TValue> dictionary)
{
    return "{" + string.Join(",", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray()) + "}";
}

1
Ich sehe keine Notwendigkeit für die ToArray(), noch für die ToString().
Steven Jeuris

3
@StevenJeuris: ToArray()wird wirklich benötigt, wenn Sie eine Version verwenden, die niedriger als NET 4.0 ist
Jack

1
genau wie map.toString () in Java;)
Choletski

110

Wenn Sie nur zu Debugging-Zwecken serialisieren möchten, ist der kürzere Weg String.Join:

var asString = string.Join(Environment.NewLine, dictionary);

Dies funktioniert, weil IDictionary<TKey, TValue>implementiert IEnumerable<KeyValuePair<TKey, TValue>>.

Beispiel

Console.WriteLine(string.Join(Environment.NewLine, new Dictionary<string, string> {
    {"key1", "value1"},
    {"key2", "value2"},
    {"key3", "value3"},
}));
/*
[key1, value1]
[key2, value2]
[key3, value3]
*/

Funktioniert super. Vielen Dank.
Marty_in_a_Box

6
Brillant! Wo war das mein ganzes Leben lang?
Tony

3
Beachten Sie, dass dies .NET 4
Cowlinator

2
Funktioniert nicht mit ListDictionary. Ansonsten großartig, abstimmend
Alex

10

Wie wäre es mit einer Erweiterungsmethode wie:

public static string MyToString<TKey,TValue>
      (this IDictionary<TKey,TValue> dictionary)
{
    if (dictionary == null)
        throw new ArgumentNullException("dictionary");

    var items = from kvp in dictionary
                select kvp.Key + "=" + kvp.Value;

    return "{" + string.Join(",", items) + "}";
}

Beispiel:

var dict = new Dictionary<int, string>
{
    {4, "a"},
    {5, "b"}
};

Console.WriteLine(dict.MyToString());

Ausgabe:

{4=a,5=b}

Atmen Sie ein und geben Sie an, dass es sich um eine Erweiterungsmethode handelt: D
Matías Fidemraizer

8

Kein praktischer Weg. Sie müssen Ihre eigenen rollen.

public static string ToPrettyString<TKey, TValue>(this IDictionary<TKey, TValue> dict)
{
    var str = new StringBuilder();
    str.Append("{");
    foreach (var pair in dict)
    {
        str.Append(String.Format(" {0}={1} ", pair.Key, pair.Value));
    }
    str.Append("}");
    return str.ToString();
}

1
Dies ist hilfreich, da es mit Code vor .NET3.5 (ohne Linq-Unterstützung) funktioniert
John Sibly

4

Vielleicht:

string.Join
(
    ",",
    someDictionary.Select(pair => string.Format("{0}={1}", pair.Key.ToString(), pair.Value.ToString())).ToArray()
);

Zuerst iterieren Sie jedes Schlüssel-Wert-Paar und formatieren es so, wie Sie es als Zeichenfolge sehen möchten. Später konvertieren Sie es in ein Array und verbinden es zu einer einzelnen Zeichenfolge.


3

Ich habe diese einfache Antwort erhalten. Verwenden Sie hierfür JavaScriptSerializerClass.

Und Sie können einfach die Serialize-Methode mit dem Dictionary-Objekt als Argument aufrufen.

Beispiel:

var dct = new Dictionary<string,string>();
var js = new JavaScriptSerializer();
dct.Add("sam","shekhar");
dct.Add("sam1","shekhar");
dct.Add("sam3","shekhar");
dct.Add("sam4","shekhar");
Console.WriteLine(js.Serialize(dct));

Ausgabe:

{"sam":"shekhar","sam1":"shekhar","sam3":"shekhar","sam4":"shekhar"}

3

Wenn Sie Linq verwenden möchten, können Sie Folgendes ausprobieren:

String.Format("{{{0}}}", String.Join(",", test.OrderBy(_kv => _kv.Key).Zip(test, (kv, sec) => String.Join("=", kv.Key, kv.Value))));

wo "test" ist dein Wörterbuch. Beachten Sie, dass der erste Parameter für Zip () nur ein Platzhalter ist, da eine Null nicht übergeben werden kann.

Wenn das Format nicht wichtig ist, versuchen Sie es

String.Join(",", test.OrderBy(kv => kv.Key));

Welches wird Ihnen so etwas geben

[key,value], [key,value],...

Ich mag den Linq-Ausdruck @Tim mehr.
Seairth

1

Eine andere Lösung:

var dic = new Dictionary<string, double>()
{
    {"A", 100.0 },
    {"B", 200.0 },
    {"C", 50.0 }
};

string text = dic.Select(kvp => kvp.ToString()).Aggregate((a, b) => a + ", " + b);

Wert des Textes: [A, 100], [B, 200], [C, 50]


0

Sie können die Schlüssel des Wörterbuchs durchlaufen und sie zusammen mit dem Wert ...

public string DictToString(Dictionary<string, string> dict)
{
    string toString = "";
    foreach (string key in dict.Keys)
    {
            toString += key + "=" + dict[key];
    }
    return toString;
}

0

Ich mag den Ansatz von ShekHar_Pro, den Serializer zu verwenden. Die einzige Empfehlung ist, json.net zum Serialisieren zu verwenden und nicht den integrierten JavaScriptSerializer, da dieser langsamer ist.


0

Ich mag Lösungen mit der obigen Erweiterungsmethode sehr, aber ihnen fehlt eine Kleinigkeit für zukünftige Zwecke - Eingabeparameter für Trennzeichen, also:

    public static string ToPairString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string pairSeparator, string keyValueSeparator = "=")
    {
        return string.Join(pairSeparator, dictionary.Select(pair => pair.Key + keyValueSeparator + pair.Value));
    }

Anwendungsbeispiel:

string result = myDictionary.ToPairString(Environment.NewLine, " with value: ");

-5

Sie müssen lediglich eine Klasse erstellen, die Dictionarydie ToString()Methode erweitert und überschreibt .

Wir sehen uns


Darf ich wissen, warum jemand -1 darauf hingewiesen hat? :) danke, wenn ich falsch liege, möchte ich, wo ich falsch liege. Vielen Dank.
Amedio

3
Ich habe diese Antwort nicht abgelehnt, aber sie enthält keinen Beispielcode. Außerdem scheint eine Unterklasse ein unnötiger Hammer zu sein, wenn Sie einfach eine Erweiterungsmethode schreiben können, wie in einigen anderen Antworten gezeigt. Auf diese Weise können Sie die Erweiterungsmethode auch direkt in Wörterbüchern aufrufen, die Sie von Code außerhalb Ihrer Kontrolle erhalten, in dem Sie nicht nur Ihre Unterklasse verwenden können.
Eliot
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.