寻找适合此场景的数据结构(最好是Dictionary和List)

本文关键字:Dictionary List 数据结构 寻找 | 更新日期: 2023-09-27 18:12:21

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

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

oPTL.ItemData, oPTL.Row

我想有一个数据结构,每次这个方法被调用时,它可以更新这个数据结构,例如一次oPTL.ItemData"Spread1", oPTL.Row2,所以我们应该能够保存Spread1的值2…例如,下一次调用我们应该能够保存"Spread3"的值为3..下一个调用"Spread1"也有值4,等等…

所以它就像一个Dictionary<String,<List>>,但我仍然有问题声明和使用它在代码中以这种方式,任何代码样本你可以帮助我?

寻找适合此场景的数据结构(最好是Dictionary和List)

您可以使用list作为值的字典:

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);

您正在寻找的是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方法的澄清。