我正在创建一个方法,找出下一个和前一个元素值之间的最小绝对差异。
在方法中出现ArgumentOutofRange异常。但是当我添加try时,捕获异常就可以了。我的代码中出现了什么问题?然而我创造了适当的条件,如“如果我等于0”当然它找不到[i-1],那么它将是下一个值[1]和[0]之间的差异。如果它成为最后一个元素,则其值(最后[i-1])和之前([i-2])
之间的差值namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
List<Cla> Clalist = new List<Cla>();
Clalist.Add(new Cla(0));
Clalist.Add(new Cla(2));
Clalist.Add(new Cla(3));
Clalist.Add(new Cla(10));
Clalist.Add(new Cla(100));
Clalist.Add(new Cla(65));
Program nn = new Program();
nn.GetAbs(Clalist);
Console.WriteLine(Clalist[0].AbsValue);
Console.WriteLine(Clalist[1].AbsValue);
Console.WriteLine(Clalist[2].AbsValue);
Console.WriteLine(Clalist[3].AbsValue);
Console.WriteLine(Clalist[4].AbsValue);
Console.WriteLine(Clalist[5].AbsValue);
Console.ReadLine();
}
public void GetAbs(List<Cla> n)
{
int z = n.Count;
for (int i = 0; i < z; i++)
{
if(i == 0)
{
n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
}
if(i == (z-1))
{
n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
}
else
{
try
{
var AbsV = Math.Abs(n[i + 1].Value - n[i].Value);
var AbsV2 = Math.Abs(n[i - 1].Value - n[i].Value); //exception occurs here
if (AbsV < AbsV2)
n[i].AbsValue = AbsV;
else
n[i].AbsValue = AbsV2;
}
/* catch (ArgumentOutOfRangeException)
{
n[0].AbsValue = n[1].Value - n[0].Value; */ When i add this it works
}
}
}
}
}
}
class Cla
{
public int Value;
public int AbsValue;
public Cla(int v)
{
Value = v;
}
}
答案 0 :(得分:4)
您应该有三个互斥的案例:
i == 0
(左边框)i == z - 1
(右边框)i == 1..z-2
(内在值)for (int i = 0; i < z; i++)
{
if (i == 0) // 1st case (left border)
{
n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
}
else if(i == (z-1)) // 2nd (please, notice "else if") (right border)
{
n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
}
else // 3d (inner values)
{
....
}
答案 1 :(得分:1)
在i == 0
时发生抛出异常的行。第二个if
语句需要成为else if
,或else
需要成为else if(i > 0)
。