gpt4 book ai didi

c# - 降低字符值的逻辑

转载 作者:太空狗 更新时间:2023-10-29 23:40:31 27 4
gpt4 key购买 nike

我正在研究一种降低字母数字值的逻辑List<char> .比如A10变成A9BBA变成BAZ123变成>122。是的,如果输入的值是最后一个(如 A0),那么我应该返回 -

额外的开销是有一个 List<char>由用户维护的变量。它具有要跳过的字符。例如,如果列表中包含 A,则值 GHB 应该变为 GGZ 而不是 GHA

这个逻辑的基础是一个非常简单的减少 char 的用法。但在这些条件下,我觉得很难。

我的项目在 Silverlight 中,语言是 C#。以下是我在 3 种方法中尝试执行的代码:

    List<char> lstGetDecrName(List<char> lstVal)//entry point of the value that returns decreased value
{
List<char> lstTmp = lstVal;
subCheckEmpty(ref lstTmp);
switch (lstTmp.Count)
{
case 0:
lstTmp.Add('-');
return lstTmp;
case 1:
if (lstTmp[0] == '-')
{
return lstTmp;
}
break;
case 2:
if (lstTmp[1] == '0')
{
if (lstTmp[0] == '1')
{
lstTmp.Clear();
lstTmp.Add('9');
return lstTmp;
}
if (lstTmp[0] == 'A')
{
lstTmp.Clear();
lstTmp.Add('-');
return lstTmp;
}
}
if (lstTmp[1] == 'A')
{
if (lstTmp[0] == 'A')
{
lstTmp.Clear();
lstTmp.Add('Z');
return lstTmp;
}
}
break;
}
return lstGetDecrValue(lstTmp,lstVal);
}



List<char> lstGetDecrValue(List<char> lstTmp,List<char> lstVal)
{
List<char> lstValue = new List<char>();
switch (lstTmp.Last())
{
case 'A':
lstValue = lstGetDecrTemp('Z', lstTmp, lstVal);
break;
case 'a':
lstValue = lstGetDecrTemp('z', lstTmp, lstVal);
break;
case '0':
lstValue = lstGetDecrTemp('9', lstTmp, lstVal);
break;
default:
char tmp = (char)(lstTmp.Last() - 1);
lstTmp.RemoveAt(lstTmp.Count - 1);
lstTmp.Add(tmp);
lstValue = lstTmp;
break;
}
return lstValue;
}






List<char> lstGetDecrTemp(char chrTemp, List<char> lstTmp, List<char> lstVal)//shifting places eg unit to ten,etc.
{
if (lstTmp.Count == 1)
{
lstTmp.Clear();
lstTmp.Add('-');
return lstTmp;
}
lstTmp.RemoveAt(lstTmp.Count - 1);
lstVal = lstGetDecrName(lstTmp);
lstVal.Insert(lstVal.Count, chrTemp);
return lstVal;
}

我真的需要帮助。请帮我解决这个问题。

最佳答案

您要解决的问题实际上是如何递减一系列字符的离散部分,每个字符都有自己的计数系统,其中每个部分由 Alpha 和 Numeric 之间的变化分隔。一旦确定了这一点,剩下的问题就很简单了。

如果您在结果中得到不需要的字符,则跳过不需要的字符只是重复递减的问题。

一个困难是序列的定义不明确。例如当你低下头说A00时要做什么,下一步是什么? “A”或“-”。为了争论起见,我假设一个基于 Excel 单元格名称的实际实现(即每个部分独立于其他部分运行)。

下面的代码完成了您想要的 95%,但是排除代码中存在错误。例如“ABB”变成“AAY”。我觉得排除需要在更高级别应用(例如,重复递减直到排除列表中没有字符),但我现在没有时间完成它。当它倒数到零时,它也会产生一个空白字符串,而不是你想要的“-”,但这在过程结束时添加是微不足道的。

第 1 部分(将问题分成几个部分):

public static string DecreaseName( string name, string exclusions )
{
if (string.IsNullOrEmpty(name))
{
return name;
}

// Split the problem into sections (reverse order)
List<StringBuilder> sections = new List<StringBuilder>();
StringBuilder result = new StringBuilder(name.Length);
bool isNumeric = char.IsNumber(name[0]);
StringBuilder sb = new StringBuilder();
sections.Add(sb);
foreach (char c in name)
{
// If we change between alpha and number, start new string.
if (char.IsNumber(c) != isNumeric)
{
isNumeric = char.IsNumber(c);
sb = new StringBuilder();
sections.Insert(0, sb);
}
sb.Append(c);
}

// Now process each section
bool cascadeToNext = true;
foreach (StringBuilder section in sections)
{
if (cascadeToNext)
{
result.Insert(0, DecrementString(section, exclusions, out cascadeToNext));
}
else
{
result.Insert(0, section);
}
}

return result.ToString().Replace(" ", "");
}

Part2(递减给定的字符串):

private static string DecrementString(StringBuilder section, string exclusions, out bool cascadeToNext)
{
bool exclusionsExist = false;
do
{
exclusionsExist = false;
cascadeToNext = true;
// Process characters in reverse
for (int i = section.Length - 1; i >= 0 && cascadeToNext; i--)
{
char c = section[i];
switch (c)
{
case 'A':
c = (i > 0) ? 'Z' : ' ';
cascadeToNext = (i > 0);
break;
case 'a':
c = (i > 0) ? 'z' : ' ';
cascadeToNext = (i > 0);
break;
case '0':
c = (i > 0) ? '9' : ' ';
cascadeToNext = (i > 0);
break;
case ' ':
cascadeToNext = false;
break;
default:
c = (char)(((int)c) - 1);
if (i == 0 && c == '0')
{
c = ' ';
}
cascadeToNext = false;
break;
}
section[i] = c;
if (exclusions.Contains(c.ToString()))
{
exclusionsExist = true;
}
}
} while (exclusionsExist);
return section.ToString();
}

除法当然可以更有效地完成,只需将开始和结束索引传递给 DecrementString,但这更容易编写和遵循,而且在实际应用中也不会慢很多。

关于c# - 降低字符值的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11326478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com