wake-up-neo.com

Kopieren Sie Schlüsselwerte aus NameValueCollection in das generische Wörterbuch

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.

24
Kobojunkie

Es ist nicht sinnvoll, Generika hier zu verwenden, da Sie strings 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;
}
31
Lee

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();
54
katbyte
parameters.AllKeys.ToDictionary(t => t, t => parameters[t]);
13
Chobits

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();
4
abatishchev

Superkurzversion

var dataNvc = HttpUtility.ParseQueryString(data);
var dataCollection = dataNvc.AllKeys.ToDictionary(o => o, o => dataNvc[o]);
2
1232133d2ffa

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.

2
Reed Copsey

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;
  }
0
Dmitriy Dokshin