【问题标题】:Array Performance/Optimization阵列性能/优化
【发布时间】:2010-12-12 06:36:54
【问题描述】:

我正在读取一个 CSV 文件,我想将结果缓存在一个数组中。

这是我的 getter/setter:

private RedirectionRule[] RedirectionRules
{
    get
    {
        if (_redirectionRules == null)
        {
            return new RedirectionRule[MAXLENGTH];
        }

        return _redirectionRules;
    }
    set
    {
        _redirectionRules = value;
    }
}

这是缓存结果的最佳方式的正确方法吗?

【问题讨论】:

    标签: c# performance arrays optimization


    【解决方案1】:

    _redirectionRulesnull 时,我认为在你的getter 中返回一个新数组没有多大意义。如果您在代码中设置解析 CSV 的属性,那么它将被缓存。


    换句话说,你应该有一个这样的函数来解析 CSV 数据(例如,我把它放在 RedirectionRule 类中,但你可以有一个 RedirectionRuleParser 类或类似的东西取决于您的需要):

    class RedirectionRule {
        public static RedirectionRule Parse(string text) {
            // some code here to parse text for your RedirectionRule object
        }
    
        public static RedirectionRule[] ParseCsv(string csv) {
            string[] values = csv.Split(',');
            RedirectionRule[] rules = new RedirectionRule[values.Length];
    
            for (int i = 0; i < values.Length; i++) {
                rules[i] = RedirectionRule.Parse(values[i]);
            }
        }
    }
    

    然后,如果你在某处有这样的代码,你正在缓存数据:

    string csv = "RuleType1,RuleType1,RuleType1";
    RedirectionRules = RedirectionRule.ParseCsv(csv);
    

    在其他地方,您要访问已缓存的数据:

    if (RedirectionRules != null) {
        // do something with your cached data
    } else {
        // I don't know, throw an exception or something
    }
    

    您的示例代码通过在您的属性的 getter 中创建一个新的 RedirectionRule[MAXLENGTH] 数组来完成的唯一一件事就是绕过上面的 RedirectionRules != null 检查,从而打开访问看起来的数据的可能性em> 好像它被缓存了,但真的是凭空出现的。

    【讨论】:

      【解决方案2】:

      一般来说很难说,这取决于你到底需要什么。

      另一个想法:当你在 getter 中创建一个完整大小的数组时,为什么你还需要一个 setter?可能应该只有 一个 位置创建数组,只是为了保持干净。

      那么——当你创建了一次数组时,这是肯定的,为什么不在构造函数中创建它呢?

      【讨论】:

        【解决方案3】:

        我不确定我是否真的理解了这个问题,因为我不确定您要问以下哪个问题

        1. 是否可以对显示的代码进行任何优化?
        2. 数组是缓存结果的最佳容器吗?
        3. 将 csv 加载到此容器中的最佳方式是什么?

        也许你问的都是三个,所以我会尽力回答所有三个

        1. 每次都在 getter 中检查 null 并不是最佳选择。我建议您改为在构造函数中对其进行初始化。
        2. 是的,数组听起来不错
        3. 我认为您必须提供更多信息才能完全回答这个问题。 String.Split 会将您的 csv 转换为我通常会做的字符串 []。

        【讨论】:

          猜你喜欢
          • 2020-03-26
          • 2021-12-03
          • 2015-06-12
          • 2012-09-26
          • 1970-01-01
          • 2015-08-24
          • 2013-03-17
          • 2016-05-14
          • 2011-10-17
          相关资源
          最近更新 更多