簡體   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