C# 中的多维关联数组

Posted

技术标签:

【中文标题】C# 中的多维关联数组【英文标题】:Multidimensional Associative Arrays in C# 【发布时间】:2021-05-23 09:00:21 【问题描述】:

开始从 JS 和 php 进入 C#。我已经习惯了对数据类型的严格使用,我正在努力弄清楚如何声明不同数据类型的多维关联数组。

例如在 PHP 中可能会做这样的事情

 $roomDiscount["apartment"][0]["minDaysOfStay"] = 10;
 $roomDiscount["apartment"][0]["discount"] = 0.3;

 $roomDiscount["apartment"][1]["minDaysOfStay"] = 15;
 $roomDiscount["apartment"][1]["discount"] = 0.35;

 $roomDiscount["apartment"][2]["minDaysOfStay"] = 16;
 $roomDiscount["apartment"][2]["discount"] = 0.5;

 $roomDiscount["presidential suite"][0]["minDaysOfStay"] = 10;
 $roomDiscount["presidential suite"][0]["discount"] = 0.1;

 $roomDiscount["presidential suite"][1]["minDaysOfStay"] = 15;
 $roomDiscount["presidential suite"][1]["discount"] = 0.15;

 $roomDiscount["presidential suite"][2]["minDaysOfStay"] = 16;
 $roomDiscount["presidential suite"][2]["discount"] = 0.2;

到目前为止,我一直在努力使用字典

private static void SkiTripWithDictionariesArrays()
        
            int daysOfStay = int.Parse(Console.ReadLine());
            string typeOfAccomodation = Console.ReadLine().ToLower().Trim();
            string review = Console.ReadLine().ToLower().Trim();

            Dictionary<string, double> roomPrices = new Dictionary<string, double>();
            Dictionary<string, object> roomDiscounts = new Dictionary<string, object>(); // <---- thats the bugger
            Dictionary<string, double> reviewAdjustment = new Dictionary<string, double>();

           
            //populate room prices
            roomPrices.Add("room for one person", 18);
            roomPrices.Add("apartment", 25);
            roomPrices.Add("president apartment", 35);

        

【问题讨论】:

您的 PHP 代码将更类似于 Dictionary&lt;string, List&lt;Dictionary&lt;string, double&gt;&gt;&gt;,尽管定义与您要存储的数据匹配的类会更有意义。 你能告诉我索引的第一个数字代表什么吗?例如$roomDiscount["presidential suite"][2] 中的 2。 2本质上只是内部数组的自动索引,本质上我可以将minDaysOfStay的值放在那里并直接与用户输入进行比较 但它代表什么?为什么会有$roomDiscount["presidential suite"][0]$roomDiscount["presidential suite"][1]$roomDiscount["presidential suite"][2] 因为否则如果我去$roomDiscount["presidential suite"]["minDaysOfStay"] = 10;$roomDiscount["presidential suite"]["minDaysOfStay"] = 15;然后总统套房-> minDaysOfStay = 15; 【参考方案1】:

你当前的 PHP 代码是这样的:

$roomDiscount["apartment"][0]["minDaysOfStay"] = 10;

在C#中很接近这种结构:

Dictionary<string, List<Dictionary<string, double>>>

声明这样一个对象可能不是一个好方法。相反,您应该定义类对象。我在下面给出的示例仅用于说明目的,不一定是最好的方法(这种情况有很多不同的方法):

public class RoomDiscount

    public int MinDaysOfStay get;set;
    public double Discount get;set;


public class RoomDiscounts

    public List<RoomDiscount> DiscountBands get;set;

用法:

Dictionary<string, RoomDiscounts> discountDetails = new Dictionary<string, RoomDiscounts>();
discountDetails["apartment"] = new RoomDiscounts 
    DiscountBands = new List<RoomDiscount> 
        new RoomDiscount 
            MinDaysOfStay = 10,
            Discount = 0.3
        ,            
        new RoomDiscount 
            MinDaysOfStay = 15,
            Discount = 0.35
        ,            
        new RoomDiscount 
            MinDaysOfStay = 16,
            Discount = 0.5
        
    
;

string room = "apartment";
int daysOfStay = 26;
double discount = discountDetails[room].DiscountBands.OrderByDescending(b => b.MinDaysOfStay).FirstOrDefault(b => daysOfStay >= b.MinDaysOfStay)?.Discount ?? 0;

再次重申,这只是您可以以更强类型的方式组织数据的一种方式的示例。请注意,如果未定义房间类型,这将引发异常,因此您可以使用 TryGetValue 从字典中检索详细信息。

【讨论】:

这是一个很好的解释@John。感谢您抽出时间。我的意思是最好的情况可能是使用数据库来处理这些事情,但让我们一步一步来。这让我对 c# 中的事物有了一个看法,并且现在可以这样做。正如你所说,可能会有大量的解决方案和方法 我确实看过其他类似的问题在这里和好老'叔叔谷歌,只是无法掌握它。我还读到其中一个,这种类方法似乎更消耗内存或类似的东西。你敢在这件事上发表你的意见吗:) @NikolayKremenliev 我通常将编程视为一种平衡行为。也就是说,你可以编写一些易于维护的东西,但它可能不是最高效的东西,或者你可以编写高效的代码,但它可能难以遵循,因此难以维护。使用静态和强类型代码有助于防止由于数据处于与我们预期不同的状态而导致的运行时错误,但它有时会使事情变得不那么灵活。另一方面,数据结构更容易理解,代码更容易阅读和维护。 我不希望它消耗的内存与您的 PHP 代码有很大不同。您本质上是以不同的格式存储相同的信息。在这里使用类(关于内存)的好处是我们不会为 MinDaysOfStay 和 Discount 变量名称存储字符串值。

以上是关于C# 中的多维关联数组的主要内容,如果未能解决你的问题,请参考以下文章

如何检查多维关联数组中的重复值?

如何从 PHP 中的多维关联数组中删除项目

如果两个值匹配,则从 php 中的多维关联数组中删除重复项

Java HashMap 关联多维数组无法创建或添加元素

如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML

关联数组与多维数组,VBA