我想要实现的结构是一个复合的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] ==某个值的字典键?
希望有意义
答案 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());