- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我最近决定我的编码风格有点笨拙。问题是,我似乎永远无法达到可以找出将其简化为更少行更高效代码的方法的阶段。
前几天,我在团队编码的情况下尝试使用 TDD 编写自动换行功能。当我坐在驾驶座上时,我大部分时间都在使用 String.Split() 以及 if 语句 this 和 if that。和我一起编码的人问为什么这么复杂,然后选择了更简单的递归代码,它返回所需的值,并在他完成后提供一些条件让他退出递归循环。
所以我的问题是——下面是我编写的一些代码,用于仅使用小写字母且不使用空格对字符串输入进行凯撒移位加密。单元测试通过,我相信我已经实现了可能出现的各种条件。
简而言之,你们如何简化下面的代码以使其更具可读性和效率?
我很感谢你在这方面的帮助,因为归根结底,我需要让我的编码风格不那么冗长,更简单,但我无法找到最好的起点。
干杯
C# 代码:
public static string Encrypt(string inputString, int shiftPattern)
{
StringBuilder sb = new StringBuilder();
char[] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
//y = x + 3 (mod 26)
foreach (var letter in inputString.ToLower())
{
if (!alphabet.Contains(letter))
{
return "The " + letter + " Character was not in the sample set, please ensure you only use letters";
}
var res = Array.IndexOf(alphabet, letter) + (shiftPattern % 26);
if (res >= 26)
{
res = res - alphabet.Length;
sb.Append(alphabet[res]);
}
else if (res < 0)
{
res = alphabet.Length + res;
sb.Append(alphabet[res]);
}
else
sb.Append(alphabet[res]);
}
return sb.ToString();
}
最佳答案
1.- 只将 sb.Append(alphabet[res]) 放在条件语句之外一次。
2.- 考虑抛出一个异常而不是返回一条消息...这样以后您就可以轻松地检查该操作是否正常工作。如果您的字母表定义中没有字符,您还应该考虑让字符“按原样”。它将允许您处理空格等。
3.- 检查最后一个条件是否真的必要。乍一看...它看起来可以安全移除...所以确认一下。我们可以添加一个 Math.Abs 函数来避免 ShiftPattern 中的负数问题。
4.- 在某些地方你使用 alphabet.Length,而在其他地方你使用 26。总是使用 alphabet.Length。
5.-不勾选(res >= 26),直接做MOD操作即可。
public static string Encrypt(string inputString, int shiftPattern)
{
StringBuilder sb = new StringBuilder();
char[] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
//y = x + 3 (mod 26)
foreach (var letter in inputString.ToLower())
{
if (!alphabet.Contains(letter)) //Consider throwing and exception instead
{
return "The " + letter + " Character was not in the sample set, please ensure you only use letters";
}
var res = Array.IndexOf(alphabet, letter) + (Math.Abs(shiftPattern) % alphabet.Length);
res = res % alphabet.Length
sb.Append(alphabet[res]);
}
return sb.ToString();
}
关于c# - 如何简化基本凯撒移位加密算法 c# 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5337080/
我刚刚开始学习 C 语言类(class),并且遇到了命令行参数的问题。分配是这样的(还有更多,但这是开头有关命令行参数的部分): - 你的程序必须接受一个命令行参数,一个非负整数。 - 如果您的程序在
我需要检查命令行参数中是否有非数字字符。例如: ./problem 20x 应该打印出“不是数字”,因为它包含一个 x。我的代码似乎没有循环遍历命令行参数中的所有字符。 我基本上尝试了不同类型的循环,
这里我有从标准输入将字符流输入到数组中的代码。然后将该数组转换为二维数组。然后,它将该数组从行列顺序更改为列行顺序。然后它打印出创建凯撒移位加密的新数组。我遇到的问题是我的数组开始使用第二个用户输入的
我有点被这个问题困住了。当我运行程序时,由于某种原因,循环经过 z 的所有字母都不会打印。问题来自这个链接:http://docs.cs50.net/2016/x/ap/problems/caesar
我是一名优秀的程序员,十分优秀!