首页 > 解决方案 > C#字典添加值数组

问题描述

我想将具有 3 个值的数组添加到字典的值中。例如:

var dict = new Dictionary<int, ComputeNTree>();
dict.Add(1, new ComputeNTree(12, 1, 0));
dict.Add(1, new ComputeNTree(14, 2, 0));
dict.Add(2, new ComputeNTree(16, 4, 0));
public class ComputeNTree
{
   public ComputeNTreeIndexes[] ComputeNTreeIndexes
}
public class ComputeNTreeIndexes
{
    public int IdCategory { get; set; }
    public int Nleft { get; set; }
    public int Nright { get; set; }
}

我可以在现有键处声明索引的数量,但如果可以将值添加到某个键并且它是关联的数组,那没问题。

编辑:我想将一些代码从 prestashop 翻译成 c#:

public static function regenerateEntireNtree()
    {
        $id = Context::getContext()->shop->id;
        $idShop = $id ? $id : Configuration::get('PS_SHOP_DEFAULT');
        $sql = new DbQuery();
        $sql->select('c.`id_category`, c.`id_parent`');
        $sql->from('category', 'c');
        $sql->leftJoin('category_shop', 'cs', 'c.`id_category` = cs.`id_category` AND cs.`id_shop` = ' . (int) $idShop);
        $sql->orderBy('c.`id_parent`, cs.`position` ASC');
        $categories = Db::getInstance()->executeS($sql);
        $categoriesArray = array();
        foreach ($categories as $category) {
            $categoriesArray[$category['id_parent']]['subcategories'][] = $category['id_category'];
        }
        
        $n = 1;

        if (isset($categoriesArray[0]) && $categoriesArray[0]['subcategories']) {
            $queries = Category::computeNTreeInfos($categoriesArray, $categoriesArray[0]['subcategories'][0], $n);

            // update by batch of 5000 categories
            $chunks = array_chunk($queries, 5000);
            foreach ($chunks as $chunk) {
                $sqlChunk = array_map(function ($value) { return '(' . rtrim(implode(',', $value)) . ')'; }, $chunk);
                Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'category` (id_category, nleft, nright)
                VALUES ' . rtrim(implode(',', $sqlChunk), ',') . '
                ON DUPLICATE KEY UPDATE nleft=VALUES(nleft), nright=VALUES(nright)');
            }
        }
    }

protected static function computeNTreeInfos(&$categories, $idCategory, &$n)
    {
        $queries = array();
        $left = $n++;
        if (isset($categories[(int) $idCategory]['subcategories'])) {
            foreach ($categories[(int) $idCategory]['subcategories'] as $idSubcategory) {
                $queries = array_merge($queries, Category::computeNTreeInfos($categories, (int) $idSubcategory, $n));
            }
        }
        $right = (int) $n++;

        $queries[] = array($idCategory, $left, $right);

        return $queries;
    }

这是我正在努力解决的最后一个功能,那部分是我的问题。

谢谢!保罗

标签: c#classdictionarymultidimensional-arrayindexing

解决方案


我假设您的目标是拥有一个<int, List<ComputeNTree>>成对的字典,正如我能够通过您的代码理解的那样:

dict.Add(1, new ComputeNTree(12, 1, 0));
dict.Add(1, new ComputeNTree(14, 2, 0));
dict.Add(2, new ComputeNTree(16, 4, 0));

从这个意义上说,您应该使用 Key 作为列表的访问器。int使用您需要的键初始化字典。您还必须创建代码来检查密钥是否存在。如果需要该功能,请添加新密钥并删除密钥。

为了将新元素添加到某个字典对中的列表中。从该对中检索列表。就像

var list = dict[key];

从那里您可以像往常一样使用 C# 列表进行操作。

list.add(new ComputeNTree(16,4,0);

因此,dict.Add()您需要实现这些方法,而不是您。检查密钥是否存在并具有初始化列表并从那里开始。


推荐阅读