【问题标题】:Hashtable with 3 parameters具有 3 个参数的哈希表
【发布时间】:2012-01-12 03:22:56
【问题描述】:

如何使用三个参数创建hashTable?我想使用hashTabledictionary 存储电话号码、姓名和地址。电话号码作为键,姓名、地址作为其值。但我只能放两个数据,电话号码和姓名。如何在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());  
    }
}

【问题讨论】:

  • var phoneList = new Dictionary>()。名字的第一个字符串,另一个字典将有两个电话......只是一个想法!
  • asik:不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过选中答案旁边的勾号来接受对您帮助最大的答案。

标签: c# dictionary hashtable


【解决方案1】:

您可以将键作为电话号码,将值作为结构,该结构有两个成员,一个是 address,一个是 name。还可以考虑改用 Dictionary,因为它是类型安全的

        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);
          }

      }

【讨论】:

  • 嗨 parapura.. 那么当我想在列表视图中显示时如何检索它的值。因为我在列表视图中有 3 列,电话号码,姓名,地址。如何分隔不同列上的名称和地址
  • 在用户信息的所有部分之后,我也会将电话号码添加到用户结构(或类)中。
【解决方案2】:

把你所有的用户数据放到一个类中:

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);

【讨论】:

    【解决方案3】:

    如果您使用的是 .NET 4.0 及更高版本,则可以使用 Tuple

    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();
    
        }
      }
    

    Further Tuples 通常以四种方式使用:

    • 表示单个数据集。例如,一个元组可以表示 数据库记录,其组件可以表示单个字段 记录。

    • 提供对数据集的轻松访问和操作。

    • 不使用 out 参数(在 C# 中)或 ByRef 参数(在 Visual Basic 中)从方法返回多个值

    • 通过单个参数将多个值传递给方法

    在底层它使用工厂模式来实例化相关结构

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2011-06-09
      • 2016-02-06
      • 2016-12-22
      • 2016-09-28
      • 2015-08-26
      相关资源
      最近更新 更多