【问题标题】:C# Multidimensional ArrayC# 多维数组
【发布时间】:2019-01-04 00:18:45
【问题描述】:

我正在尝试开发一个使用网站数据库的桌面应用程序(winforms)。我目前正在开发本地数据库以避免在开发时浪费主机流量。

我遇到了这样一个场景,我在谷歌上搜索了 2 天,但找不到关于如何实现特殊类型数组的具体答案。

目前我正在尝试以数组的形式从数据库中检索用户信息,但我还需要一些项作为数组,而其他项则保留为字符串。

在 PHP 中我使用类似的东西:

$user["username"] = $result["username"];
$user["name"] = $result["name"];
$user["lastname"] = $result["lastname"];

等等。问题来自从数据库中检索电话号码的查询,因为大多数用户至少有 2 个号码(家庭和手机)

foreach ($phones as $type => $phone) {
  $user["phone"][$type] = $phone;
}

其中 $type 是电话类型(家庭线路、主单元、工作单元、寻呼机等),$phone 包含号码。 所以,就我搜索和阅读的所有内容而言,我已经了解了这一点

Dictionary<string, string>可以使用第一个字符串作为数组键,第二个字符串作为数组值,但是第二个字符串不能转换为数组 Dictionary<string, List<string>> 可以创建二级数组,但不能将字符串存储为值。 (Can't convert 'string' into 'System.Collections.Generic.List<string>')

那么,实现这一特定场景的最佳方法是什么?如何让数组同时保存字符串和数组数据?

【问题讨论】:

  • 就个人而言,我不会使用 PHP 作为从 C# 数据库中检索数据的示例。我会将数据读入支持所需格式的自定义类中。像$user["phone"][$type] 这样的东西基本上是一个嵌套的Dictionary,这不是我想在代码中看到的。
  • 您可能正在寻找一个数组数组,也称为“锯齿状数组”。这可以适合您想要的任何自定义对象。这可能会有所帮助docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/…
  • foreach 行明确显示我正在使用来自$user 的已分配键中的键值。很抱歉不知道 C# 用语,但如果您仔细阅读,key => value 格式非常明确。

标签: c# list dictionary multidimensional-array


【解决方案1】:

完成这项任务的更好方法是结构数组

public struct DatabaseNode
    {
        public string Username;
        public string Name;
        public string Lastname;
        public Dictionary<string,string> Phones;

        public DatabaseNode(string user,string name,string lastname,string housephone)
        {
            Username = user;
            Name = name;
            Lastname = lastname;
            Phones = new Dictionary<string, string>();
            Phones.Add("House", housephone);
        }

        public void Add_Phone(string type,string num)
        {
            Phones.Add(type, num);
        }
    }

使用这个可以很容易地拥有一个数据库节点数组并存储不同的数据,甚至在需要时在使用前转换数据。

【讨论】:

  • 这听起来很有希望。我应该在项目的另一个文件中创建该结构吗?哪个是实施它的最佳方法?
  • 你可以把它放在一个单独的文件中。对我来说,我保持结构很小并且使用它的类。要使用这个你想做 DatabaseNode[] Nodes=new DatabaseNode[20]; (或者你喜欢的列表)然后填充它 Nodes[0]=new DatabaseNode("FluffBall","Joe","Blogs","0000000000000");如果您需要更多手机,请使用 Nodes[0].Add_Phone("Work","1111111111111111");
  • 不需要做一个数组。我已经有一个只有用户名的用户数组,当管理员或版主双击表中的用户时,将显示这个额外的信息,所以不需要做一个用户数组,只需要一个用户数据数组。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2012-03-24
相关资源
最近更新 更多