为这种情况寻找合适的数据结构(最好是字典和列表)

时间:2011-10-24 21:38:47

标签: c# dictionary

在方法调用中,对象正在传递它。

从这个对象我可以得到两件事:ItemData属性和Row属性,例如:

oPTL.ItemData, oPTL.Row

我希望有一个数据结构,每次调用此方法时,它都可以更新此数据结构,例如,一次oPTL.ItemData"Spread1"oPTL.Row为{{1}所以我们应该能够保存2具有值Spread1 ...下一次调用例如我们应该能够保存“Spread3”具有值3..next调用“Spread1”具有ALSO值等等...

所以它就像2但我仍然有问题在代码中以这种方式声明和使用它,你可以帮助我的任何代码示例吗?

2 个答案:

答案 0 :(得分:2)

您要找的是Dictionary<string, List<int>> - 假设您的.ItemData.Row属性实际上分别为stringint

当您阅读带有“Spread1”值的项目时,首先通过调用.ContainsKey(string)方法检查字典中是否已存在此类密钥。如果是,则添加新的Row值 - 如果没有,则使用全新列表创建新密钥,如下例所示:

var myItems = new Dictionary<string, List<int>>();
// ...
if (myItems.ContainsKey(newItem.ItemData))
{
    // myItems[newItem.ItemData] actually contains List<int> we created at some
    // point in the other part of if-else. 
    // The .Add method we call here belongs to List
    List<int> itemValues = myItems[newItem.ItemData];
    itemValues.Add(newItem.Row);
}
else
{
    myItems.Add(newItem.ItemData, new List<int> { newItem.Row });
}

已编辑以使用两种.Add方法添加说明。

答案 1 :(得分:2)

您可以使用值为列表的字典:

IDictionary<string, List<int>> rows = new Dictionary<string, List<int>>();

要填充它,您可以使用此扩展方法:

public static class DictionaryDefaultExtension
{
    public static TValue GetOrDefault<TKey, TValue>(
        this IDictionary<TKey, TValue> dictionary,
        TKey key,
        Func<TValue> defaultValue)
    {
        TValue result;
        if (dictionary.TryGetValue(key, out result))
        {
            return result;
        }
        else
        {
            TValue value = defaultValue();
            dictionary[key] = value;
            return value;
        }
    }
} 

像这样使用:

d.GetOrDefault(oPTL.ItemData, () => new List<int>()).Add(oPTL.Row);