我需要根据用户输入的范围检查数字列表,例如,用户将输入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
}
}
我希望我所要求的是有道理的。如果我走在正确的道路上,请告诉我,非常感谢任何意见
答案 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();
}
列表中的最后两个数字已删除):
答案 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++;
}
}