【问题标题】:C# Dictionary As Application CacheC# 字典作为应用程序缓存
【发布时间】:2015-09-09 19:55:23
【问题描述】:

我什至不知道我是否走在正确的轨道上,但我尝试使用 Dictionary 来存储大数据和静态数据(如多语言数据)并在整个应用程序中使用它。此示例适用于 WinForms 应用程序。

在这种情况下,我有一个表格,其中包含各种参数,分为几组。该表由以下字段组成:GROUP_CODE, PARAMETER_KEY, PARAMETER_VALUE... 它只包含许多值,如本例所示:

GROUP_CODE:“MAILING_INFO”
PARAMETER_KEY: 'SendMailAfterProcessIsDone'
PARAMETER_VALUE:'a@b.com'

没有问题或任何东西可以保存并从数据库中获取数据。我唯一的问题是我将如何处理这些数据......

我的 ParameterValues 类包含以下我从表中选择的相同字段...

public class ParameterValues
{
    private string groupCode;
    private string parameterKey;
    private string parameterValue;

    public string GroupCode
    {
        get { return groupCode; }
        set { groupCode = value; }
    }

    public string ParameterKey
    {
        get { return parameterKey; }
        set { parameterKey = value; }
    }

    public string ParameterValue
    {
        get { return parameterValue; }
        set { parameterValue = value; }
    }
}

在另一个名为 CacheHelper 的类中,我试图将此对象与 GROUP_CODE 值作为键放入字典中。 (希望这是有道理的)

public class CacheHelper
{
    public Dictionary<string, ParameterValues> LoadParameterCache2()
    {
        //Dictionary<string, ParameterValues> objList = new Dictionary<string, ParameterValues>();

        Dictionary<string, List<ParameterValues>> objList = new Dictionary<string, List<ParameterValues>>();

            //call the values from the database blah blah
            while (rdr.Read())
            {

                ParameterValues cacheObj = new ParameterValues();
                cacheObj.ParameterKey = rdr.GetString("PARAMETER_KEY");
                cacheObj.ParameterValue = rdr.GetString("PARAMETER_VALUE");
                objList.Add(rdr.GetString("GROUP_CODE"), /*List ParameterValues goes here blah blah*/);
            }


        return objList; //and finally return it to the main application thread
    }
}

我必须按照数据库中的 GROUP_CODE 值对其进行分组,因为 Dic 的“键”必须是唯一的……我知道……

由于我认为还不够清楚,因此我试图在下图中展示我实际尝试做的事情......

我根本不能把它分组。请有人告诉我一种方法...如果这是一种将其用作非常大数据(我的意思是数千行)的应用程序缓存的好方法,我也想听听您的想法。

非常感谢!

【问题讨论】:

  • 您可能想查看一个KeyedCollection,它允许您使用GroupCode 参数作为字典的键,而您无需手动将其设置为键。但是,这并不能解决您的唯一性问题,因为 KeyedCollection 在其键上具有与 Dictionary 相同的限制,只是想让您了解类型。
  • 您的方法签名与您的返回类型不匹配。
  • System.Runtime.Caching 有一个用于处理应用程序缓存需求的 MemoryCache 类。我已经将它用于很多大的事情,包括本地化字符串。
  • @StingyJack 这不是重点,哈哈...好吧,但我也可以在 ASP.Net 应用程序中使用它吗?
  • 你能解释一下你所说的“我根本不能把它分组”是什么意思吗?为什么不?您是否收到错误或其他问题不起作用?

标签: c# list dictionary grouping


【解决方案1】:

我不打算谈论缓存解决方案,因为那里有一些,我对任何一个都没有特别的经验。

但如果您想尝试静态字典解决方案,您可以尝试使用 Linq 对数据进行分组:

public Dictionary<string, List<ParameterValues>> LoadParameterCache2()
{
    List<KeyValuePair<string, ParameterValues>> dataValues = new List<KeyValuePair<string, ParameterValues>>();

    // Your code to produce the DataReader
    DataTableReader rdr = GetDataReader();

    while (rdr.Read())
    {
        ParameterValues cacheObj = new ParameterValues();
        cacheObj.ParameterKey = (string)rdr["PARAMETER_KEY"];
        cacheObj.ParameterValue = (string)rdr["PARAMETER_VALUE"];

        KeyValuePair<string, ParameterValues> dataValue = new KeyValuePair<string, ParameterValues>((string)rdr["GROUP_CODE"], cacheObj);

        dataValues.Add(dataValue);
    }

    Dictionary<string, List<ParameterValues>> objList = dataValues.GroupBy(d => d.Key).ToDictionary(k => k.Key, v => v.Select(i => i.Value).ToList());

    return objList;
}

【讨论】:

  • 这正是我想要的。非常感谢!
【解决方案2】:

我想我知道你有什么问题,请注意语法可能不是 100%,因为我是从记忆中输入的。

public class CacheHelper
{
  public Dictionary<string, List<ParameterValues>> LoadParameterCache2()
  {
       var objList = new Dictionary<string, List<ParameterValues>>();

        //call the values from the database blah blah
        while (rdr.Read())
        {

            var cacheObj = new ParameterValues();
            cacheObj.ParameterKey = rdr.GetString("PARAMETER_KEY");
            cacheObj.ParameterValue = rdr.GetString("PARAMETER_VALUE");

 //here is where you need to change things.
            var groupCode = rdr.GetString("GROUP_CODE");
            if (objList.ContainsKey(groupCode) == false)
            {
               objList.Add(groupCode, new List<ParameterValues> {cacheObj});
            }
            else 
            {
               objList[groupCode].Add(cacheObj);
            }
        }


    return objList; //and finally return it to the main application thread
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2012-03-26
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多