引发异常时退出循环是否可以?

时间:2020-01-07 13:38:07

标签: c# arrays

我在Hackerrank.com上解决了一个任务,问题是这样的:

您有一个数组。此数组包含数字。
现在,您输入两个数字:

  • 第一个描述总和
  • 第二个描述了您加在一起的索引数量(序列长度)

最后,您得到的序列数之和是您定义的数字

例如:

您的数组为[1,2,3,4],总和为3,序列长度为2。
现在,您获取前两个索引并输出总和:[1,2] =3。
这等于您的总和,所以现在您找到了一个序列。
下一个序列是[2,3] =5。这不等于3,因此您的序列计数器保持为1。
最后一个序列是[3,4] =7。这也不等于3,最后找到一个序列。

我为此编写了这段代码:

static int GetSequences(List<int> s, int d, int m)
{
    //m = segment-length
    //d = sum

    int count = 0;
    int j = 0;
    int k = 0; 

    do
    {
        try
        {
            List<int> temp = new List<int>();

            for (int i = 0; i < m; i++)
            {
                temp.Add(s[i + k]);
            }
            if (temp.Sum() == d)
            {
                count++;
            }
            j++;
            k++;
        }
        catch (ArgumentOutOfRangeException)
        {
            break;
        }

    } while (true);

    return count;
}

因为我不知道必须多久计数一次
(例如,序列长度为3的6长度数组有4个序列(1,2,3 | 2,3,4 | 3,4,5 | 4,5,6)),
当索引超出范围时,我正在停止while循环。但我不确定此解决方案是否可以不仅具有程序速度,还具有代码清洁度。这段代码可以接受吗?还是最好使用for循环,例如对于具有3个长度序列的6长度数组,该循环恰好循环了4次?

3 个答案:

答案 0 :(得分:5)

不推荐,不。异常应该保留给不应该发生的事情,而不是流控制或验证。

您要使用条件逻辑(if语句)和break关键字。

此外,codereview.stackexchange.com更适合此类问题。

答案 1 :(得分:0)

通常,除了开关/情况外,通常没有使用中断的真正原因。 顾名思义,必须也是例外,因此一定不能成为您逻辑的一部分。 就像Je​​ppe所说的,您可以使用框架提供的方法和属性。 s.Count似乎是要解决的办法。

答案 2 :(得分:0)

<DatePicker x:Name="FinancialYear">
    <DatePicker.Resources>
        <Style TargetType="{x:Type DatePickerTextBox}">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, StringFormat='dd MM', 
                                    RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DatePicker.Resources>
</DatePicker>