2

我有这个预定义的字符串数组:

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

根据用户输入,我填充List<string>如下:

List<String> UsedAreas = new List<String>();
int RangeOfInput = (int)entity.AreasCnt;
UsedAreas = SkippedAreasArray.ToList().GetRange(0, RangeOfInput);

A to Q同样从用户输入中,我得到另一个字符串,其中包含来自(如 in SkippedAreasArray)中的非重复字母。

数组是这样形成的:

SkippedAreasFromForm = (txtSkippedAreas.Text).ToUpper().Split(',');

我要做的是首先 - 排序SkippedAreasFromForm

Array.Sort<string>(SkippedAreasFromForm);

然后我需要以下内容:

foreach (string tempAreaValue in SkippedAreasFromForm)
{
    if (UsedAreas.Contains(tempAreaValue))
    {

    }
    else 
    { 

    }
}

如果List<> UsedAreas包含被选中的字母,我想从列表中删除这个字母,同时添加按字母顺序跟随的下一个字母。

附言

我现在看到我的目标在这里并不清楚,所以我将解释它的含义:

SkippedAreasFromForm是一个应该被验证的用户输入,这就是想要这个算法的想法。如果在某些情况下if (UsedAreas.Contains(tempAreaValue))返回 false 则输入错误,我需要返回错误消息。

4

2 回答 2

4

您可以使用 LINQ to Objects 来实现,而无需循环:

UsedAreas = SkippedAreasArray.Except(SkippedAreasFromForm)
                             .OrderBy(e => e)
                             .Take(RangeOfInput)
                             .ToList();

它正在RangeOfInput从中获取SkippedAreasArray不在SkippedAreasFromForm. 结果是List<string>

更新

您可以通过这种方式检查您的错误消息条件:

if(SkippedAreasFromForm.Except(SkippedAreasArray.Take(RangeOfInput)).Any())
{
    // incorrect user input
}
于 2013-04-02T06:41:36.447 回答
1
IEnumerable<string> usedAreas = SkippedAreasArray.Take(RangeOfInput);
IEnumerable<string> skippedAreasFromForm = (txtSkippedAreas.Text).ToUpper()
    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
IEnumerable<string> invalids = skippedAreasFromForm.Except(usedAreas);
if (invalids.Any())
    MessageBox.Show(string.Format("These are invalid: [{0}]", 
        string.Join(",", invalids.OrderBy(sa => sa))));
于 2013-04-02T06:55:56.503 回答