Хранение во вложенном словаре C # - PullRequest
1 голос
/ 12 мая 2011
Broadcom 

Connection Name: Local Area Connection

DHCP Enabled:    No

IP address(es)  
     [01]: abc.de.fg.h

Я хотел бы поместить это в Dictionary<string, Dictionary <string, string>> Таким образом, Broadcom будет ключом в первом словаре, а остальное будет значением value. Значение должно храниться в виде словаря, в котором Имя соединения - это ключ, а Подключение по локальной сети - это значение. Как мне это сделать? Я новичок в программировании. Спасибо за помощь.

Ответы [ 2 ]

8 голосов
/ 13 мая 2011

Пожалуйста, сделайте себе одолжение и используйте для этого класс, потому что через два месяца вы не поймете свой код:

public class WhatIsThis {

  private List<IPAddress> ipAddresses = new List<IPAddress>();

  public string Name { get; set; }
  public string ConnectionName { get; set; }
  public bool DHCPEnabled { get; set; }
  public List<IPAddress> IPAddresses { get  return ipAddresses; }
}

Теперь вы можете хранить List<WhatIsThis>. Если у вас их всего несколько, затраты на поиск стоимости незначительны. Если вам нужен поиск по имени в виде O (1), вы можете сопоставить словарь следующим образом:

var dict = listOfWhatisThis.ToDictionary(k=>k.Name, v=>v}

Дает вам словарь типа Dictionary<string,WhatIsThis>. Как вы думаете, вы поймете это лучше через 2 недели, или, скорее, ваш страшный словарь?

1 голос
/ 13 мая 2011

http://msdn.microsoft.com/en-us/library/bb531208.aspx

var dic = new dictionary<string, dictionary <string, string>>(
    {"Broadcom", 
        new dictionary <string, string>(
            {
                {"Connection Name", "Local Area Connection"},
                {"DHCP Enabled", "No"},
                {"IP address(es) [01]", "abc.de.fg.h"}
            }
        )
    }
);

Меня беспокоит только то, что IP-адреса должны находиться в словаре в настройках соединения, а не в одной строке, и, таким образом, потребуется подсловарьбыть dictionary<string, object>.

Аналогично ответу flq, вот более всеобъемлющее решение, которое делает оба подкрепления:

using System.Collections.Generic;
using System.Linq;

namespace LINQDictionaryDemo
{
    public class IPAddress
    {
        public int Index { get; private set; }
        public string Value { get; private set; }

        public IPAddress(int Index, string Value)
        {
            this.Index = Index;
            this.Value = Value;
        }
    }

    public class NetworkConnection
    {
        public string Name { get; set; }
        public string ConnectionName { get; set; }
        public bool DHCPEnabled { get; set; }
        public List<IPAddress> IPAddresses { get; set; }

        public Dictionary<string, object> ToDictionary()
        {
            return new Dictionary<string, object>
                       {
                            { "ConnectionName", ConnectionName }
                            , { "DHCPEnabled", DHCPEnabled.ToString() }
                            , {"IPAddresses", IPAddresses.ToDictionary(k => k.Index, v => v.Value)}
                       };
        }
    }

    public static class Demo
    {
        public static void Run()
        {
            var lnc = new List<NetworkConnection>
                          {
                              new NetworkConnection
                                  {
                                      Name = "Broadcom",
                                      ConnectionName = "Local Area Connection",
                                      DHCPEnabled = false,
                                      IPAddresses = new List<IPAddress> {new IPAddress(1, "abc.de.fg.h")}
                                  }
                          };
            var dic = lnc.ToDictionary(k => k.Name, v => v.ToDictionary());
        }
    }
}
...