我想像这样建立一个Dictonary:
Dictionary<String, ArrayList> myDic = new Dictionary<String, ArrayList>();
最后我想要一个像:
这样的结构["blabla"] => array(1,2,3)
["foo"] => array(1,4,6,8)
.......
构建这个我在循环中运行并在每个循环中构建一些字符串,
第一个问题:
每次检查此字符串是否存在时如何检查 在字典中,如果它不存在,则在字典中打开一个新条目,在数组列表中有一个元素,如果存在则只将另一个元素添加到数组列表中
和另一个问题:
如何根据数组列表中的元素数量(按降序排序)对此字典进行排序,如:
["foo"] => array(1,4,6,2,8)
["bar"] => array(4,6,2,8)
["bla"] => array(1,2,3)
["blo"] => array(1,2)
.......
谢谢!
答案 0 :(得分:5)
使用正确的工具完成工作。您想要的数据结构称为“多字典” - 这是一个字典,它从键映射到值序列,而不是从键映射到唯一值。
PowerCollections codebase包含MultiDictionary的实现,可能执行您想要的操作。我会用它而不是写你自己的。
要将字典排序为按序列长度排序的键/序列对序列,我将使用带有“order by”子句的LINQ查询。这似乎是最简单的方法。
答案 1 :(得分:2)
您应该使用数组或ArrayList
而不是List<T>
。假设您有一个名为Dictionary<string, int>
的来源,这应该有效:
var items = source
.GroupBy(kvp => kvp.Key)
.Select(grp => new { Key = grp.Key, Items = grp.Select(kvp => kvp.Value).ToArray() })
.OrderByDescending(i => i.Items.Length);
要解释一下,Dictionary<TKey, TValue>
实现IEnumerable<KeyValuePair<TKey, TValue>>
,可以将其视为一系列键值对。按键分组对,然后Select
创建一个匿名类型的序列,其中分别包含Key和Items属性中的键和关联值。然后按照每个对象的Items
数组中的项目数对此序列进行排序。
如果您想按创建的数组的长度对它们进行排序,则不能使用字典,因为它们不是有序的。
答案 2 :(得分:1)
要检查字典中是否存在密钥并使用该值,您可以使用TryGetValue
:
ArrayList array;
if(!myDic.TryGetValue("blabla", out array))
{
array = new ArrayList();
myDic["blabla"] = array;
}
array.Add(42);
答案 3 :(得分:0)
这样的事情会起作用吗?
if (myDic.ContainsKey(myString))
myDic[myString].Add(myNumber);
else
myDic.Add(myString, new ArrayList(new int[] {myNumber}));