c#关联数组与字典

时间:2010-12-15 19:38:44

标签: c# dictionary associative-array

我想像这样建立一个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)    
    .......

谢谢!

4 个答案:

答案 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}));