Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理常量数据的最佳方法?(C#)_C# - Fatal编程技术网

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

处理常量数据的最佳方法?(C#),c#,C#,管理依赖于一个或多个条件变量(int、float、string等)的常量数据的最佳通用方法(速度和处理)是什么 基本示例: Car CreateCar(int brand) { //... float colourValue = GetRandomFloat(0F, 1F); car.Coulor = GetCarCoulor(brand, colourValue); //... } //------------- //Example for data func

管理依赖于一个或多个条件变量(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;
}
carcreatecar(int品牌)
{
//...
float colorValue=GetRandomFloat(0F,1F);
car.Coulor=GetCarCoulor(品牌、颜色值);
//...
}
//-------------
//数据函数示例:
//-------------
字符串GetCarCoulor(int品牌,float colorValue)
{
如果(品牌==0)
{
如果(颜色值<0.3)
返回“红色”;
否则如果(颜色值<0.7)
返回“绿色”;
其他的
返回“蓝色”;
}
否则如果(品牌==1)
{
如果(颜色值<0.2)
返回“红色”;
其他的
返回“蓝色”;
}
//...
返回“默认”;
}
浮动速度(int品牌、int carModel、int档位、bool returnMin)
{
如果(品牌==0)
{
如果(carModel==0)
{
如果(档位==1)
{
如果(返回分钟)
返回1F;
其他的
返回15F;
}
否则如果(档位==2)
{
如果(返回分钟)
返回15F;
其他的
返回40F;
}
}
//...
}
否则如果(品牌==1)
{
//...
}
//...
返回0F;
}
带有if-else结构的函数显然是最基本的形式,适用于大多数数据,但不一定在较大的数据集上具有良好的外观/处理和性能。 否则,我会想到
Dictionary
switch
结构,但这些结构在处理多个或某些类型的输入变量时效果不佳

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

我还读过使用XML文件存储数据的故事。对于这类数据,这通常是可取的,还是较慢或增加了太多的复杂性?优点/缺点


编辑:扩展示例,以显示我想到的数据函数类型。

如果将多个输入变量封装在一个类中,该类具有适当的相等语义,包括哈希代码(您必须始终定义与相等语义兼容的哈希代码语义),则字典仍然是好的.

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

来自常量的资源

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

return ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")
字符串组合: 当结果可以通过代码的“串联”来确定时,您可以输入参考资料

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

另一种方法是,只要输入类型保持不变,就可以有一个“规则”字典

实际上,我不建议这样做(见下面的注释),但这是一种可能性

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;
}
void Main()
{
列表规则=新列表();
rules.Add(新的RuleResultPair)
{
规则=(输入)=>input.A==0&&input.B<0.3,
结果=“输出1.1”
});
rules.Add(新的RuleResultPair)
{
规则=(输入)=>input.A==0&&input.B<0.7,
结果=“输出1.2”
});
var test1Point1=新输入
{
A=0,
B=0.2F
};
var test1Point2=新输入
{
A=0,
B=0.7F
};
rules.First(w=>w.Rule(test1Point1)).Result.Dump();//输出output1.1
rules.First(w=>w.Rule(test1Point2)).Result.Dump();//输出output1.2
}
//在此处定义其他方法和类
公共结构输入
{
公共INTA;
公共浮动B;
}
公共类RuleResultPair
{
公共谓词规则;
公共字符串结果;
}

我确信这段代码可以得到很大的改进,但为了示例的目的,我希望保持它相对简单

作为一般性说明: 看起来这可能会导致维护问题。通常是switch语句块或if语句有点复杂

看起来,要扩展应用程序,您必须修改一个巨大的开关if/else块

也许a可以帮助打破你的算法。但这要视情况而定

编辑:


根据LiWa关于需要改变输入的附加示例,下面是一篇有用的博客文章,描述了如何将switch语句重构为单独的算法:

当我看到你的问题时,HashTable这个词一次又一次地出现在我的脑海中,可能是一个lambda,用于根据不同的参数计算键。什么样的规则将决定输出(或者你的示例是你想要的)?您是否需要修改“规则”,即代码维护是否存在问题。还是将规则组合在一起?你需要测试规则吗?基本上都取决于具体情况。在一种情况下IF-ELSE很好,在另一种情况下切换可能更好,有时创建字典更可取。每种方法都是可行的,每种方案都没有一个单一的赢家。您所描述的并不涉及固定的数据。您可以说正在对引用数据执行查找。不过,比较运算符使这成为一条规则。实现规则的方法有很多,有些涉及字典等查找结构。如果始终检查
input1
是否相等,并且
input2
始终有一个阈值,则可以使用
字典
保存具有阈值的元组以及每个可能的INTA的可能结果,以便进行数据存储,选择任何可以使加载结构更容易的选项。对于简单规则,可以使用一个简单的表,每个规则有一行。或者可以使用json文件。在这种情况下,如果您打算首先使用
,那么字典是一个非常糟糕的选择