繁体   English   中英

处理常量数据的最佳方法? (C#)

[英]Best way to handle constant data? (C#)

管理依赖于一个或多个条件变量(int,float,string,...)的常量数据的最佳通用方法(速度和处理)是什么?

基本示例:

Car CreateCar(int brand)
{
    //...
    float colourValue = GetRandomFloat(0F, 1F);
    car.Coulor = GetCarCoulor(brand, colourValue);
    //...
}

//-------------
//Example for data functions:
//-------------

string GetCarCoulor(int brand, float colourValue)
{
    if (brand == 0)
    {
        if (colourValue < 0.3)
            return "red";
        else if (colourValue < 0.7)
            return "green";
        else
            return "blue";
    }
    else if (brand == 1)
    {
        if (colourValue < 0.2)
            return "red";
        else
            return "blue";
    }
    //...
    return "default";
}

float GetCarSpeed(int brand, int carModel, int gear, bool returnMin)
{
    if (brand == 0)
    {
        if (carModel == 0)
        {
            if (gear == 1)
            {
                if (returnMin)
                    return 1F;
                else
                    return 15F;
            }
            else if (gear == 2)
            {
                if (returnMin)
                    return 15F;
                else
                    return 40F;
            }
        }
        //...
    }
    else if (brand == 1)
    {
        //...
    }
    //...
    return 0F;
}

具有if-else结构的函数显然是适用于大多数数据的最基本形式,但不一定具有更大的数据集的外观/处理和执行效果。 否则会出现Dictionary<T1,T2>switch构造,但这些对多种或某些类型的输入变量不起作用。

那么有没有其他类型的构造/方法来查找常量数据或某种最佳实践规则?

我还读到了使用XML文件进行数据存储。 这通常适用于这类数据,还是较慢或增加太多复杂性? 优点缺点?

编辑:扩展示例,以显示我想到的数据功能。

作为替代方法,只要输入类型保持不变,就可以使用“规则”字典。

我实际上不会推荐这个(见下面的注释),但这是可能的。

void Main()
{
    List<RuleResultPair> rules = new List<RuleResultPair>();

    rules.Add(new RuleResultPair 
    {
        Rule = (input) => input.A == 0 && input.B < 0.3, 
        Result = "output1.1"
    });

    rules.Add(new RuleResultPair
    {
        Rule = (input) => input.A == 0 && input.B < 0.7,
        Result = "output1.2"
    });

    var test1Point1 = new Input
    {
        A = 0,
        B = 0.2F
    };

    var test1Point2 = new Input
    {
        A = 0,
        B = 0.7F
    };


    rules.First(w => w.Rule(test1Point1)).Result.Dump(); //outputs output1.1
    rules.First(w => w.Rule(test1Point2)).Result.Dump(); //outputs output1.2

}

// Define other methods and classes here
public struct Input
{
    public int A;
    public float B;
}

public class RuleResultPair
{
    public Predicate<Input> Rule;
    public string Result;
}

http://share.linqpad.net/pqouhc.linq

我确信这段代码可以大大改进,但我想为了示例的目的而保持相对简单。

作为一般性说明:

看起来这可能会导致维护问题。 通常,switch语句块或if语句都有点代码味道。

看起来好像要扩展你的应用程序,你必须修改一个巨型开关,if / else阻止。

也许策略模式可以帮助您分解算法。 但这取决于。

编辑:


从LiWa需要改变输入的另一个例子来看,这是一篇有用的博客文章,描述了将switch语句重构为单独的算法: 应用策略模式而不是使用切换语句

如果将几个输入变量封装在单个类中,字典仍然可以很好,它具有适当的相等语义,包括哈希代码(您必须始终定义与您的相等语义兼容的哈希代码语义)。

我在过去发现了一些有用的模式,并未涵盖所有情况,但你可以在这里找到一些东西......

来自常数的资源

当您将一个或多个输出作为单个值(作为开关)的函数时,您可以使用资源。

return ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")

字符串组合:当可以使用代码的“串联”确定结果时,您可以删除资源

public string Decode(string a, string b, string c)
{
    return ResourceNamespace.ResxFileName.ResourceManager.GetString(a + b + c);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM