【问题标题】:Dynamicly remove and add another letter from a List<> keeping alphabetical order从 List<> 中动态删除和添加另一个字母,保持字母顺序
【发布时间】:2013-04-02 06:37:10
【问题描述】:

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

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

根据用户输入,我会像这样填充List&lt;string&gt;

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

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

数组是这样形成的:

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

我首先要做的是对SkippedAreasFromForm 进行排序:

Array.Sort<string>(SkippedAreasFromForm);

然后我需要以下内容:

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

    }
    else 
    { 

    }
}

如果List&lt;&gt; UsedAreas 包含已检查的字母,我想从列表中删除该字母,同时按字母顺序添加下一个字母。

附言

我现在看到我的目标在这里并不清楚,所以我会解释一下这个的含义:

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

【问题讨论】:

标签: c# arrays string list


【解决方案1】:

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

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

它从SkippedAreasArray 中获取RangeOfInput 元素,这些元素不在SkippedAreasFromForm 中。结果是List&lt;string&gt;

更新

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

if(SkippedAreasFromForm.Except(SkippedAreasArray.Take(RangeOfInput)).Any())
{
    // incorrect user input
}

【讨论】:

  • 对不起,由于没有解释这背后的想法,我发现我有误导性。请阅读编辑后的帖子。
  • 老实说 - 我不明白这个 LINQ 查询,但它有效。谢谢。
  • 我不会使用Count() &gt; 0,而是Any(),只要查询返回一个元素就会中断,而Count需要执行整个查询。
【解决方案2】:
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))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2014-04-08
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多