如何在 for 循环中包含大量指令 If? [复制]
Posted
技术标签:
【中文标题】如何在 for 循环中包含大量指令 If? [复制]【英文标题】:How can I include a large number of instruction If in for loops? [duplicate] 【发布时间】:2021-04-27 21:50:46 【问题描述】:我有一个程序,它返回两个不匹配字符在两个字符串中的相同位置的 ASCII 表的距离。我想缩短我的程序,但是以这样的方式返回与以前相同的结果。(程序不能返回负值,因此它在每个 If 指令中检查哪个数字具有更大的值并且字符串始终具有相同的长度) 现在程序每次比较时都会抛出一个错误:“System.IndexOutOfRangeException: 'Index was outside the bounds of the array.”但它显示正确的结果..
代码
public static void incompatible(string a, string b)
char[] characters1 = new char[a.Length];
char[] characters2 = new char[b.Length];
for (int i = 0; i < a.Length; i++)
characters1 [i] = a[i];
for (int i = 0; i < b.Length; i++)
characters2 [i] = b[i];
if (a.Length >= 0 || b.Length >= 0)
if (characters1 [0] != characters2 [0])
if (characters1 [0] > characters2 [0])
Console.WriteLine(characters1 [0] - characters2 [0]);
else if (characters1 [0] < characters2 [0])
Console.WriteLine(characters2 [0] - characters1 [0]);
if (a.Length >= 1 || b.Length >= 1)
if (characters1 [1] != characters2 [1])
if (characters1 [1] > characters2 [1])
Console.WriteLine(characters1 [1] - characters2 [1]);
else if (characters1 [1] < characters2 [1])
Console.WriteLine(characters2 [1] - characters1 [1]);
if (a.Length >= 2 || b.Length >= 2)
if (characters1 [2] != characters2 [2])
if (characters1 [2] > characters2 [2])
Console.WriteLine(characters1 [2] - characters2 [2]);
else if (characters1 [2] < characters2 [2])
Console.WriteLine(characters2 [2] - characters1 [2]);
if (a.Length >= 3 || b.Length >= 3)
if (characters1 [3] != characters2 [3])
if (characters1 [3] > characters2 [3])
Console.WriteLine(characters1 [3] - characters2 [3]);
else if (characters1 [3] < characters2 [3])
Console.WriteLine(characters2 [3] - characters1 [3]);
我现在有 14 个类似上述的 If 指令。
【问题讨论】:
请查看“Math.Abs”作为简化代码的第一步 另外,将两个数组的最小长度放入一个变量中,然后遍历该变量的所有索引。检查这些索引.. 顺便说一句,没有“if
循环”之类的东西
【参考方案1】:
1.你不需要使用额外的char数组,你可以使用a[index]
,b[index]
。
2.Math.Abs()
将返回正差,所以不要像这样的行:
if (characters1 [2] > characters2 [2])
Console.WriteLine(characters1 [2] - characters2 [2]);
else if (characters1 [2] < characters2 [2])
Console.WriteLine(characters2 [2] - characters1 [2]);
你可以这样做:
Console.WriteLine(Math.Abs(characters1 [0] - characters2 [0]));
所以关于循环,你的整个代码可以变成这样:
public static void incompatible(string a, string b)
for(int i=0; i<Math.Min(a.Length,b.Length);i++)
if(a[i] != b[i])
Console.WriteLine(Math.Abs(characters1 [i] - characters2 [i]));
【讨论】:
【参考方案2】:无需将字符复制到characters1
和characters2
变量中。字符串确实有一个索引器,您可以通过它访问它们的所有字符。
首先得到两个字符串的最小长度。我们只能比较较短字符串的长度。
int length = Math.Min(a.Length, b.Length);
现在使用 for 循环遍历字符
for (int i = 0; i < length; i++)
... more to come
在循环中,您可以使用索引i
比较同一位置的字符。取其字符码差的绝对值。这消除了负面迹象。
int diff = Math.Abs(a[i] - b[i]);
请注意,这是我们唯一一次访问字符。每个都只被访问一次。您的代码最多访问每个 5 次(复制时,比较 !=、>、Writeline 中。
如果差值不为 0,则将结果写入控制台
if (diff != 0)
Console.WriteLine(diff);
现在大家在一起
public static void incompatible(string a, string b)
int length = Math.Min(a.Length, b.Length);
for (int i = 0; i < length; i++)
int diff = Math.Abs(a[i] - b[i]);
if (diff != 0)
Console.WriteLine(diff);
就是这样!
【讨论】:
以上是关于如何在 for 循环中包含大量指令 If? [复制]的主要内容,如果未能解决你的问题,请参考以下文章