0

我有一个预定义的字符串数组,其中包含从Ato的字母Q

string[] SkippedAreasArray = new string[] {"A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"};

TextBox内部 Windows 窗体中,用户可以像这样输入 skippedAreas:A,B,C,D...验证和限制只能使用字母和逗号,因此保证输入是这种格式。

我所做的是接受用户输入并填充另一个字符串数组:

string[] SkippedAreasFromForm = new string[17];
...
SkippedAreasFromForm = (txtSkippedAreas.Text).Split(',');

现在是我正在寻求帮助的棘手部分。用户必须输入Number of areas例如 - 3。这意味着他只使用ABC。如果区域数为 2,则他只能使用AB如果区域数为 4,则ABCD可用,依此类推。

我需要检查在SkippedAreasFromForm填充了用户输入的数组中是否存在与上述条件不匹配的区域。

这在编码方面意味着什么 - 我需要从 中获取每个元素 SkippedAreasFromForm,从预定义中获取它的整数值,SkippedAreasArray并查看该值是否等于或大于他输入为“区域数”的值 (>=)。如果存在超出所选数字范围的区域,则应显示错误。

我现在拥有的是:

foreach (string tempAreaValue in SkippedAreasFromForm)
                {
                    for (int i = 0; i < SkippedAreasArray.Length; i++)
                    {
                        if (tempAreaValue == SkippedAreasArray[i])
                        {
                            if ((i + 1) > entity.AreasCnt)
                            {
                                MessageBox.Show("You must use areas only within the Number of Areas scope!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                txtSkippedAreas.Focus();
                                return false;
                            }
                        }
                    }
                }

对于少数测试,我使它有效。但首先 - 至少对我来说它似乎过于复杂。其次 - 我不确定这个算法是否完全按照我的需要工作,或者我只是幸运地得到了正确的结果。第三 - 我现在正在编写 C# 代码 2 个月,在我看来,这似乎是 LINQ 表达式的绝佳候选者 - 你认为使用 LINQ 会更好吗,我希望能在转换中提供帮助。

4

2 回答 2

5

我想你只是在寻找IndexOf

int index = SkippedAreasArray.IndexOf(tempAreaValue);
if (index >= entity.AreasCnt)
{
    ...
}

(您可能还想检查是否为index-1,如果元素根本不在列表中,则会发生这种情况。另外,考虑重复 - 用户可以输入A, A,A吗?)

于 2013-04-01T09:30:27.377 回答
1

如果您正在查找数组中从起始索引到基于 areaNumber 的最大字符串元素的元素,则:

int areaNumber = 4;
var result = SkippedAreasArray.Select((r, i) => new { Value = r, Index = i })
                              .Where(r => r.Index <= areaNumber - 1)
                              .Select(r => r.Value)
                              .ToArray();

因为areaNumber 4你会得到"A", "B", "C", "D"

编辑:

我正在查看用户输入中的每个元素(数组 A、C、H、Q ..)是否在由 areNumber 确定的区域内(来自评论)

假设您的 userInputArray 是:

string[] userInputArray = new string[] {"A", "C", "H", "Q"};

然后你可以通过Enumerable.Except以下方式使用:

if(result.Except(userInputArray).Any())
{
  //Invalid
}
else
{
 //Valid
}
于 2013-04-01T09:34:36.197 回答