使用string []作为Dictionary键,例如Dictionary <string [],stringbuilder =“”> </string [],>

时间:2010-03-30 17:02:11

标签: generics data-structures

我想要实现的结构是一个复合的Dictionary键,它是项目名称和项目displayname,而Dictionary值是n个字符串的组合

所以我想出了

var pages = new Dictionary<string[], StringBuilder>()
{
    { new string[] { "food-and-drink", "Food & Drink" }, new StringBuilder() },
    { new string[] { "activities-and-entertainment", "Activities & Entertainment" }, new StringBuilder() }
};

foreach (var obj in my collection)
{
    switch (obj.Page)
    {
        case "Food":
        case "Drink":
            pages["KEY"].Append("obj.PageValue");
            break;
        ...
    }
}

我遇到问题的部分是访问词典键pages["KEY"]

如何定位其值为[0] ==某个值的字典键?

希望有意义

3 个答案:

答案 0 :(得分:2)

这不起作用。数组通过引用而不是内容来比较相等性。

您必须创建自己的帮助器结构,该结构包含字符串并覆盖Equals()GetHashCode()以使用第一个字符串,甚至可能具有来自字符串的隐式转换运算符,或者提供自定义{ {1}}到做比较键的工作的字典。

修改 - 代码示例:

IEqualityComparer<string[]>

答案 1 :(得分:2)

基于一些评论:

  朱丽叶:听起来像你一样   滥用字典。你为什么   需要一个字符串[]作为键?什么是   使用“食物和饮料”作为一个错误   键?

     

OP:我正在创建一组嵌套   通过循环遍历CMS中的页面   页面词典,“食物和饮料”   part将用作显示名称   用于CMS的页面(Sitecore)   不允许某些字符   项目名称,否则在创建时   如果页面,我将不得不做的页面   name == x display name = y,我   不想做

你有一个架构问题,带字符串数组的键肯定是解决它的错误方法。永远不要将string[]object[]用于临时数据组,而是创建一个类。

此外,如果您的词典键入一个数据,则将其键入一个数据。所有其他数据部分应存储在您的值中。

让我们从这开始:

public class Page
{
    public readonly string PageTitle;
    public readonly StringBuilder Content;

    public Page(string pageTitle)
    {
        this.PageTitle = pageTitle;
        this.Content = new StringBuilder();
    }
}

并像这样使用它:

var pages = new Dictionary<string, Page>()
{
    { "food-and-drink", new Page("Food & Drink") },
    { "activities-and-entertainment", new Page("Activities & Entertainment")
};

foreach (var obj in myCollection)
{
    pages[obj.Page].Content.Append(obj.PageValue);
}

可能的是,这不是完美的方法,而是你实际上要做的事情,但我认为它是将复合数据存储为字典键的奇怪之处。 / p>

答案 2 :(得分:-2)

我会在string []上创建一个新的扩展方法,以返回数组内容的哈希值,然后可以用作键:

    public static int GetKey(this string[] array)
    {
        var builder = new System.Text.StringBuilder();
        foreach (var value in array)
        {
            builder.Append(value);
        }
        return builder.ToString().GetHashCode();
    }

使用:

var pages = new Dictionary<int, StringBuilder>();
var array = new string[] { "food-and-drink", "Food & Drink" };
pages.Add(array.GetKey(), new StringBuilder());