C#根据用户输入的范围检查数字列表

时间:2017-05-29 19:26:56

标签: c#

我需要根据用户输入的范围检查数字列表,例如,用户将输入105323到106324的范围。该列表表示用户知道丢失的数字。因此,如果用户输入范围并且列表包含106100和106101,我需要输出跳过范围内的所有数字或删除106100和106101.我确定这很简单,但我只是有逻辑的麻烦。这是我到目前为止所拥有的

        var startSeq = uxSeqStart.Text;
        var startNum = Convert.ToInt32(startSeq);
        var endSeq = uxSeqEnd.Text;
        var endNum = Convert.ToInt32(endSeq);

        for (var a = startNum; a <= endNum; a++)
        {

            foreach (int num in _MissingInt.ToList())
            {
                if (num + 1 == a) { _MissingInt.Remove(num); }
            }

            Console.WriteLine(a);//test output not a console app
        }

    }

我希望我所要求的是有道理的。如果我走在正确的道路上,请告诉我,非常感谢任何意见

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您有一个不应包含在范围内的整数列表,并且您将获得用户的一系列整数。然后你想从范围中删除“缺失的int”。

生成一系列连续数字的简单方法是使用System.Linq方法Enumerable.Range(),在其中传入要生成的起始编号和数字计数。我们可以使用用户输入的起始编号,但由于他们输入的是结束编号而不是计数,我们需要做一些数学运算来确定计数:

// Generate a range of numbers based on the user input
var range = Enumerable.Range(startNum, endNum - startNum + 1);

然后,您可以在范围内使用另一个名为System.Linq的{​​{1}}扩展方法,以删除Except()列表中的项目(如果存在)。 _MissingInt表示“包括原始列表中的所有项目,但另一个列表中存在的项目除外”:

Except

总而言之,它看起来像:

// Remove any numbers in the _MissingInt from range if they exist
range = range.Except(_MissingInt);

<强>输出

(请注意,我们的static void Main() { var _MissingInt = new List<int> { 106100, 106101 }; var startNum = 105323; var endNum = 106101; var range = Enumerable.Range(startNum, endNum - startNum + 1).Except(_MissingInt); // Output the range with missing ints removed Console.WriteLine("Modified Range:"); Console.WriteLine(string.Join(", ", range)); Console.Write("\nDone!\nPress any key to exit..."); Console.ReadKey(); } 列表中的最后两个数字已删除):

enter image description here

答案 1 :(得分:2)

您可以尝试使用 Linq 来生成集合(例如数组):

   HashSet<int> missing = new HashSet<int>() {
     106100, 106101, 
   };

   int start = 105323; // included
   int stop = 106324;  // included

   var result = Enumerable
     .Range(start, stop  - start + 1)
     .Where(item => !missing.Contains(item))
     .ToArray();

测试

  Console.Write(string.Join(" ", result));       

答案 2 :(得分:0)

有很多方法可以做到这一点。

Dmitry Bychenko解决方案简短易行。

由于您只使用整数,因此您只需订购缺失数字列表,然后使用因子N(通过序列一次)而不是N *包含来完成操作(对于序列中的每个数字,呼叫包含)。

var startSeq = uxSeqStart.Text;
var startNum = Convert.ToInt32(startSeq);
var endSeq = uxSeqEnd.Text;
var endNum = Convert.ToInt32(endSeq);
Int[] missingInts = _MissingInt.ToList();

missingInts.sort();

foreach(int num in missingInts)
{
    while(startNum <= endNum)
    {
        if (startNum == num) 
        {
            startNum++;
            break;
        }
        Console.WriteLine(startNum);
        startNum++;
    }
}