我正在尝试编写一个代码,该代码对语句是否为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
以此类推。
答案 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);
}