Hashtable с 3 параметрами - PullRequest
       10

Hashtable с 3 параметрами

6 голосов
/ 03 декабря 2011

Как мне сделать hashTable с тремя параметрами? Я хочу хранить телефонные номера, имена и адреса, используя hashTable и dictionary. Номер телефона в качестве ключа, а имя, адрес в качестве его значения. Но я могу поставить только две данные, номер телефона и имя. Как мне сохранить номер телефона, имя, адрес в hashTable?

Hashtable phoneBook;

public FrmPhoneBook()
{
    InitializeComponent();
    phoneBook = new Hashtable();
}

public void addNewPhoneBook(string name, string tel, string add)
{
    string names = name;
    string telp = tel;
    string address = add;

    if (!phoneBook.ContainsKey(telp))
    {
        phoneBook.Add(telp, names);
        getDetails();
    }
}

public void getDetails()
{
    lvDetails.Items.Clear();
    foreach (DictionaryEntry values in phoneBook)
    {
        lvDetails.Items.Add(values.Value.ToString());
        lvDetails.Items[lvDetails.Items.Count - 1].SubItems.Add(
           values.Key.ToString());  
    }
}

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

Вы можете использовать ключ в качестве номера телефона и значение в виде структуры, в которой есть два члена, один из которых - адрес , а другой - имя . Также рассмотрите возможность перехода на Словарь , так как он безопасен

        struct User
        {
            public string Name;
            public string Address;
        }

       static void Main(string[] args)
       {
           Dictionary<string, User> hash = new Dictionary<string, User>();

          //To add to the hash
           hash.Add( "22255512282" , 
                new User(){ Name = "foo" , Address = "Bar" });

          //To lookup by key
          User user;
          if (hash.TryGetValue("22255512282", out user))
          {
             Console.WriteLine("Found " + user.Name);
          }

      }
4 голосов
/ 04 декабря 2011

Поместите все ваши пользовательские данные в класс:

public class User
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }
}

Затем обработайте следующим образом:

Dictionary<string, User> reverseLookUp = new Dictionary<string, User>();
User user;

// Fill dictionary
user = new User { Name = "John", Address = "Baker Street", PhoneNumber = "012345" };
reverseLookUp.Add(user.PhoneNumber, user);
user = new User { Name = "Sue", Address = "Wall Street", PhoneNumber = "333777" };
reverseLookUp.Add(user.PhoneNumber, user);

// Search a user
string phoneNumber = "012345";
if (reverseLookUp.TryGetValue(phoneNumber, out user)) {
    Console.WriteLine("{0}, {1}, phone {2}", user.Name, user.Address, user.PhoneNumber);
} else {
    Console.WriteLine("User with phone number {0} not found!", phoneNumber);
}

// List all users
foreach (User u in reverseLookUp.Values) {
    Console.WriteLine("{0}, {1}, phone {2}", u.Name, u.Address, u.PhoneNumber);
}

Вы также можете создать специальный словарь для этой цели:

public class PhoneDict : Dictionary<string, User>
{
    public void Add(User user)
    {
        Add(user.PhoneNumber, user);
    }
}

Затем добавьте пользователей следующим образом:

PhoneDict phoneDict = new PhoneDict();
User user;

// Fill dictionary
user = new User { Name = "John", Address = "Baker Street", PhoneNumber = "012345" };
phoneDict.Add(user);
user = new User { Name = "Sue", Address = "Wall Street", PhoneNumber = "333777" };
phoneDict.Add(user);
1 голос
/ 03 декабря 2011

Вы можете использовать Tuple, если вы используете .NET 4.0 и выше

Dictionary<string, Tuple<string, string>> myHash = new Dictionary<string, Tuple<string, string>>();

от MSDN

Кортеж - это структура данных с определенным номером и последовательностью элементов . Примером кортежа является структура данных с тремя элементами (известная как 3-кортеж или тройка), которая используется для хранения идентификатора, такого как имя человека в первом элементе, год во втором элементе и доход человека за этот год в третьем элементе.

Вот пример кода, который вы можете использовать

class Program
  {
    static void Main(string[] args)
    {

      Dictionary<string, Tuple<string, string>> myHash = new Dictionary<string, Tuple<string, string>>();

      //Test with 10 records

      //Create 10 records
      Enumerable.Range(1, 10).All(a => { myHash.Add("12345" + a.ToString(), new Tuple<string, string>("user" + a.ToString(), "user" + a.ToString() + "address")); return true; });

      //Display 10 records
      myHash.Keys.All(a => { Console.WriteLine(string.Format("Key/Phone = {0} name = {1} address {2}", a, myHash[a].Item1, myHash[a].Item2)); return true; });

      Console.ReadLine();

    }
  }

Другие кортежи обычно используются четырьмя способами:

  • Для представления единого набора данных. Например, кортеж может представлять запись базы данных, и ее компоненты могут представлять отдельные поля записи.

  • Для обеспечения легкого доступа к массиву данных и манипулирования им.

  • Чтобы вернуть несколько значений из метода без использования параметров out (в C #) или ByRef (в Visual Basic) .

  • Для передачи нескольких значений методу через один параметр .

Под капотом используется фабричный шаблон для определения относительной структуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...