如果给定的if语句为true或false,如何分配一个会更改的值

时间:2019-07-10 06:29:07

标签: c#

我正在尝试编写一个代码,该代码对语句是否为true进行计数,并为每个“ true”的if语句分配一个值。 例如,如果第一条语句为true,则需要分配A。如果下一条语句为false,则跳过。如果下一条语句为true,则分配B。依此类推。

我已经尝试过将其放入for循环中,但没有得到想要的结果。

public virtual void AssignEnabledOptions()
    {
        int iBtnCount = 0;
        string sVar1, sVar2, sVar3, sVar4, sVar5, sVar6;

        sVar1 = "2";
        sVar2 = "1";
        sVar3 = "1";
        sVar4 = "1";
        sVar5 = "0";
        sVar6 = "1";


        if (sVar1.Value.Equals("1") || sVar1.Value.Equals("2"))
            iBtnCount = iBtnCount + 1; // if true, assign A
        if (sVar2.Value.Equals("1"))
            iBtnCount = iBtnCount + 1; // if true, assign B, if false, assign B to next true statement
        if (sVar3.Value.Equals("1") || sVar3.Value.Equals("2"))
            iBtnCount = iBtnCount + 1;
        if (sVar4.Value.Equals("1"))
            iBtnCount = iBtnCount + 1;
        if (sVar5.Value.Equals("1"))
            iBtnCount = iBtnCount + 1;
        if (sVar6.Value.Equals("1"))
            iBtnCount = iBtnCount + 1;
    }

基于上面的数据,我希望得到输出:

sVar1 = A
sVar2 = B
sVar3 = C
sVar4 = D
sVar5 = None
sVar6 = E

以此类推。

4 个答案:

答案 0 :(得分:1)

我看不到任何方法,因为sVar是单个变量。如果它们存储在列表或列表数组中,则可以执行以下操作:

int iBtnCount = 0;
//string[] sVars = { sVar1, sVar2, sVar3, sVar4, sVar5, sVar6 };
string[][] possibleValues =
{
    new string[]{ "1", "2" },
    new string[]{ "1" },
    new string[]{ "1", "2" },
    new string[]{ "1" },
    new string[]{ "1" },
    new string[]{ "1" },
};

for(int i = 0; i < sVars.Length; i++)
{
    if(possibleValues[i].Contains(sVars[i]))
    {
        sVars[i] = ((char)('A' + iBtnCount++)).ToString();
    }
    else
    {
        sVars[i] = "None";
    }
}

答案 1 :(得分:1)

如果条件为真,则分配下一个字母的类:

public class Assigner : IDisposable
{
    private char _current;

    public bool CheckAndAssign(Predicate<string> condition, ref string sVar)
    {            
        if (condition(sVar))
        {
            if (_current == default(char))
            {
                _current = 'A'                    
            }
            else
            {
                _current++;
            }

            sVar = _current.ToString();
        }
        else
        {
            sVar = "None"
        }
    }

    public void Dispose()
    {
        _current = default(char);
    }
}

呼叫例如:

using(var assigner = new Assigner())
{
    assigner.CheckAndAssign(x => x.Equals("1") || x.Equals("2"), ref sVar1);
    // etc.
}

Сan还可以循环使用,并且可以以任何方式使用。

答案 2 :(得分:0)

list[i] = ((char)(letter + iBtnCount)).ToString();  

这将正确地给您下一个字符。

private void AssignEnabledOptions()
    {
        int iBtnCount = 0;
        string sVar1, sVar2, sVar3, sVar4, sVar5, sVar6;
        char letter = 'A';

        sVar1 = "2";
        sVar2 = "1";
        sVar3 = "1";
        sVar4 = "1";
        sVar5 = "0";
        sVar6 = "1";

        List<string> list = new List<string>
        {
            sVar1,
            sVar2,
            sVar3,
            sVar4,
            sVar5,
            sVar6
        };

        for (int i = 0; i < list.Count; i++)
        {
            if (Convert.ToInt32(list[i]) > 0)
            {
                list[i] = ((char)(letter + iBtnCount)).ToString();
                iBtnCount = iBtnCount + 1;
            }
            else
            {
                list[i] = "None";
            }
        }
    }

答案 3 :(得分:0)

您的要求不清楚。 但是,您应该理解的关键概念是可以对字符执行数学运算

char myLetter = 'A';
myLetter++; //now myLetter == 'B'

这是一种可能的实现方式,但实际上,应根据您的实际目标,使它更具通用性。

    void AssignEnabledOptions()
    {
        string[] options = {"2", "1", "1", "1", "0", "1"};
        bool one(string s) => s == "1";
        bool oneOrTwo(string s) => s == "1" || s == "2";

        var predicates = new List<Func<string, bool>> {oneOrTwo, one, oneOrTwo, one, one, one};

        var results = options.Zip(predicates, (s, pred) => pred(s));
        char character = 'A';
        var resultCharacters = results.Select(b => b ? character++.ToString() : null);
    }