如何测试一个值是否不等于任何有效的选择?

问题描述 投票:0回答:2

我正试图使用name[key]语法来上调字典中键值对中的int的值。传入函数的是一个大小不一的字符串。我使用 foreach 方法对字符串进行迭代,但继续得到以下错误。

System.ArgumentException : Value does not fall within the expected range.

函数如下。

public static IDictionary<char, int> Count(string sequence)
{
    IDictionary<char, int> Dna = new Dictionary<char, int>();
    Dna.Add('A', 0);
    Dna.Add('C', 0);
    Dna.Add('G', 0);
    Dna.Add('T', 0);

    foreach(char c in sequence)
    {
        if(c != 'A' || c != 'C' || c != 'G' || c != 'T')
        {
            throw new ArgumentException();
        }
        ++Dna[c];
    }

    return Dna;             
}

堆栈跟踪识别了字符串被传入的那行和第20行,也就是++Dna[c]行。

我还在学习C#,只学了几天。

我试过几个贴子里的解决方案,但得到的是同样的错误。我需要多学些什么,才能理解这个概念?

这是来自另一个网站上的一个练习。

c# key-value idictionary
2个回答
2
投票

你的条件是错误的。应该是

if(c != 'A' && c != 'C' && c != 'G' && c != 'T')
{
  throw new ArgumentException();
}

1
投票

如果你想只计算字符,这等于任何从 A, C, GT 并对超出这个范围的字符抛出一个错误,你应该使用 条件性逻辑和 && 操作员而不是 条件逻辑OR ||if 声明

foreach (var c in sequence)
{
    if (c != 'A' && c != 'C' && c != 'G' && c != 'T')
    {
        throw new ArgumentException();
    }
    ++Dna[c];
}

另外,你可以使用 continue 语句来处理下一次迭代的 foreach

if (c != 'A' && c != 'C' && c != 'G' && c != 'T')
{
    continue;
}
© www.soinside.com 2019 - 2024. All rights reserved.