Versuch, Werte aus einem vorhandenen NameValueCollection-Objekt in ein Dictionary zu kopieren. Ich habe den folgenden Code, um dies zu tun, aber das Hinzufügen akzeptiert nicht, dass meine Schlüssel und Werte als Zeichenfolgen angegeben werden
IDictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();
public void copyFromNameValueCollection (NameValueCollection a)
{
foreach (var k in a.AllKeys)
{
dict.Add(k, a[k]);
}
}
Hinweis: NameValueCollection enthält String-Schlüssel und -Werte. Daher möchte ich hier nur eine Methode angeben, mit der diese in ein generic - Dictionary kopiert werden können.
Es ist nicht sinnvoll, Generika hier zu verwenden, da Sie string
s keinem beliebigen generischen Typ zuordnen können:
IDictionary<string, string> dict = new Dictionary<string, string>();
public void copyFrom(NameValueCollection a)
{
foreach (var k in a.AllKeys)
{
dict.Add(k, a[k]);
}
}
sie sollten jedoch wahrscheinlich eine Methode erstellen, um stattdessen ein neues Wörterbuch zu erstellen:
public static IDictionary<string, string> ToDictionary(this NameValueCollection col)
{
IDictionary<string, string> dict = new Dictionary<string, string>();
foreach (var k in col.AllKeys)
{
dict.Add(k, col[k]);
}
return dict;
}
was kannst du wie:
NameValueCollection nvc = //
var dictionary = nvc.ToDictionary();
Wenn Sie eine generelle Methode zum Konvertieren der Zeichenfolgen in der Auflistung in die erforderlichen Schlüssel-/Werttypen verwenden möchten, können Sie Typkonverter verwenden:
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this NameValueCollection col)
{
var dict = new Dictionary<TKey, TValue>();
var keyConverter = TypeDescriptor.GetConverter(typeof(TKey));
var valueConverter = TypeDescriptor.GetConverter(typeof(TValue));
foreach(string name in col)
{
TKey key = (TKey)keyConverter.ConvertFromString(name);
TValue value = (TValue)valueConverter.ConvertFromString(col[name]);
dict.Add(key, value);
}
return dict;
}
Erweiterungsmethode plus linq:
public static Dictionary<string, string> ToDictionary(this NameValueCollection nvc) {
return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]);
}
//example
var dictionary = nvc.ToDictionary();
parameters.AllKeys.ToDictionary(t => t, t => parameters[t]);
Verwenden Sie LINQ:
public static IDictionary<string, string> ToDictionary(this NameValueCollection collection)
{
return collection.Cast<string>().ToDictionary(k => k, v => collection[v]);
}
Verwendungszweck:
IDictionary<string, string> dic = nv.ToDictionary();
Superkurzversion
var dataNvc = HttpUtility.ParseQueryString(data);
var dataCollection = dataNvc.AllKeys.ToDictionary(o => o, o => dataNvc[o]);
Wenn Sie wissen, dass Ihr Wörterbuch immer Zeichenfolgen enthält, geben Sie an, dass Zeichenfolgen enthalten sind, anstatt Ihre Klasse als generisch zu definieren:
IDictionary<string, string> dict = new Dictionary<string, string>();
Damit funktionieren die Dinge wie geschrieben (ohne die generische Methodenspezifikation).
Wenn Sie eine generische Klasse benötigen und generische Daten enthalten möchten, müssen Sie eine Möglichkeit zur Konvertierung von string
in TKey
und string
in TValue
verwenden. Sie können Delegaten für Ihre Kopiermethode dazu bereitstellen:
public void CopyFrom(NameValueCollection a, Func<string, TKey> keyConvert, Func<string, TValue> valueConvert)
{
foreach(var k in a.AllKeys)
{
dict.Add(keyConvert(k), valueConvert(a[k]));
}
}
Sie müssen dann einen Delegaten übergeben, der die Konvertierung von String in TValue
und String in TKey
durchführt.
Sie sollten EqualityComparer nicht vergessen. Es ist jedoch kein öffentliches Eigentum. Sie sollten also Reflektion verwenden, um es zu bekommen.
public static IEqualityComparer GetEqualityComparer(this NameObjectCollectionBase nameObjectCollection)
{
PropertyInfo propertyInfo = typeof(NameObjectCollectionBase).GetProperty("Comparer", BindingFlags.Instance | BindingFlags.NonPublic);
return (IEqualityComparer)propertyInfo.GetValue(nameObjectCollection);
}
public static IEqualityComparer<string> GetEqualityComparer(this NameValueCollection nameValueCollection)
{
return (IEqualityComparer<string>)((NameObjectCollectionBase)nameValueCollection).GetEqualityComparer();
}
public static Dictionary<string, string> ToDictionary(this NameValueCollection nameValueCollection)
{
Dictionary<string, string> dictionary =
nameValueCollection.AllKeys.ToDictionary(x => x, x => nameValueCollection[x], nameValueCollection.GetEqualityComparer());
return dictionary;
}