我有一个预定义的字符串数组,其中包含A
到Q
的字母:
string[] SkippedAreasArray = new string[] {"A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"};
在Windows窗体内的TextBox
中,用户可以输入skippedAreas,如下所示:A,B,C,D...
有验证和限制只能使用字母和逗号,因此保证输入采用此格式。
我所做的是获取用户输入并填充另一个字符串数组:
string[] SkippedAreasFromForm = new string[17];
...
SkippedAreasFromForm = (txtSkippedAreas.Text).Split(',');
现在是我寻求帮助的棘手部分。用户必须输入Number of areas
例如 - 3.这意味着他只使用A
,B
和C
。如果区域数为2,则只有A
和B
,如果区域数为4,则A
,B
,C
和{ {1}}可用,等等。
我需要的是检查填充了用户输入的数组D
中是否存在与上述条件不匹配的区域。
这在编码方面意味着什么 - 我需要从SkippedAreasFromForm
中获取每个元素,从预定义的SkippedAreasFromForm
中取出它的整数值,并查看此值是否等于或大于(> =)他作为“区域数量”输入的值。如果某个区域超出所选数字的范围,则应显示错误。
我现在拥有的是:
SkippedAreasArray
对于少数测试我做了它。但首先 - 至少对我而言似乎过于复杂。第二 - 我不确定这个算法是否正常工作,或者我只是运气得到了正确的结果。第三 - 我现在正在编写C#2个月,这对我来说似乎是LINQ表达的一个很好的候选者 - 你认为使用LINQ会更好吗?我会感谢你在转换中的帮助。
答案 0 :(得分:5)
我认为您只是在寻找IndexOf
:
int index = SkippedAreasArray.IndexOf(tempAreaValue);
if (index >= entity.AreasCnt)
{
...
}
(您可能还想检查index
是否为-1,如果该元素根本不在列表中,则会发生这种情况。另外,请考虑重复 - 用户可以输入{{1} },A
,A
?)
答案 1 :(得分: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
}