[英]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.