列表只包含前两项
本文关键字:两项 包含前 列表 | 更新日期: 2023-09-27 18:22:42
好吧,我很确定isNumber终于可以工作了。感谢大家的帮助。我想我几乎已经准备好真正开始这个项目了。我只是想把我的脑袋放在单子上。
我正在做的是尝试同时检查一堆输入是否是数字,并将结果存储在列表中。这样,要想知道其中是否有一个是数字,我只需检查第二个列表中的相应值即可。
所以,我的问题是,我清楚地在列表中列出了3件事,但当我让它打印出项目数时,它总是显示2。这到底是怎么回事?具体来说,为什么areNumbers总是返回一个长度为2的列表,而我显然让它至少和numberOfNumbers一样长?
PS我知道我的代码看起来还不是很好。在学习风格之前,我想先掌握基本知识。
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
Console.WriteLine(areNumbers(maybe).Count);
Console.ReadLine();
}
static ArrayList areNumbers(ArrayList maybeNumbers)
{
var theResults = new ArrayList(0);
var numbersEnumerator = maybeNumbers.GetEnumerator();
var numberOfNumbers = 0;
try
{
for (; ; )
{
numberOfNumbers = numberOfNumbers + 1;
numbersEnumerator.MoveNext();
var myIsNumber = isNumber(numbersEnumerator.Current);
var myAreNumbers = new ArrayList(numberOfNumbers);
myAreNumbers.Add(theResults);
myAreNumbers.Add(myIsNumber);
theResults = myAreNumbers;
}
}
catch (InvalidOperationException)
{
return theResults;
}
}
static bool isNumber(object theObject)
{
var s = theObject.GetType().ToString().ToUpper();
Console.WriteLine(s);
return theObject is int || theObject is Int64 || theObject is float || theObject is double;
}
如注释所述,返回值areNumbers
最多是一个包含2个项的ArrayList(第一个项是0到N-2项的布尔值ArrayList;第二个项是第(N-1)个值的布尔值)。如果我在脑海中正确地遍历了代码,那么如果你发送一个空的ArrayList,你就会得到一个空ArrayList。
一项之后:
areNumbers[0]:[]//空数组列表areNumbers[1]:true
两项之后:
areNumbers[0]:[[],true]//第一项之后areNumbers[1]:false
三项之后
areNumbers[0]:[[[],true],false]//第二项之后areNumbers[1]:true
如果您使用数字的第四个值进行调用:
areNumbers[0]:[[[[],true],false],true'']areNumbers[1]:true
现在希望你不会陷入前泛型&LINQ之前的世界。。。
Where
将根据您的isNumber
功能进行过滤:
var maybeNumbers = new List<object>{ 100f, "not a number", 1000 };
var areNumbers = maybeNumbers.Where(isNumber).ToList();
Assert.AreEqual(2, areNumbers.Count()); //passes!
如果你是LINQ用户,试试这个:
List<object> maybeNumbers = new List<object>();
maybeNumbers.Add(100f);
maybeNumbers.Add("not a number");
maybeNumbers.Add(1000);
List<object> areNumbers = new List<object>();
foreach(object maybe in maybeNumbers)
{
if (isNumber(maybe))
areNumbers.Add(maybe);
}
预泛型(可能不会编译…)
ArrayList maybeNumbers = new ArrayList();
maybeNumbers.Add(100f);
maybeNumbers.Add("not a number");
maybeNumbers.Add(1000);
ArrayList areNumbers = new ArrayList();
foreach(object maybe in maybeNumbers)
{
if (isNumber(maybe))
areNumbers.Add(maybe);
}
这将遍历对象列表,并给您一个布尔响应,让您知道它们是否是数字,我认为这就是您的代码最终要做的。
var testNumbers = new List<object>();
testNumbers.Add(15);
testNumbers.Add("AUUUGHH");
testNumbers.Add(42);
foreach (var i in testNumbers)
Console.WriteLine(Microsoft.VisualBasic.Information.IsNumeric(i));
请确保添加对Microsoft.VisualBasic命名空间的引用,以便使用IsNumeric()
1.不要依赖try/catch来实现正常的代码流。try/catch用于捕捉异常情况
2.为什么需要构建isNumber方法?double.tryParse或Convert.ToDouble()将执行类似的操作(通过谷歌查找差异)
3.不知道myAreNumbers应该做什么,但你基本上是在每次迭代时向新列表添加一个bool和一个列表
static ArrayList areNumbers(ArrayList maybeNumbers)
{
var theResults = new ArrayList(0);
foreach(var possibleNumber in maybeNumbers)
{
double myDouble;
if (double.tryParse(possibleNumber, out myDouble))
theResults.Add(possibleNumber);// OR theResults.Add(myDouble); //depending on what you want
}
return theResults;
}
- 摆脱无休止的循环
- 迭代你可能的数字
- 用try包围。。。catch only isNumber
如果有例外,不要增加数字的数量。不要为此返回泛型,因为您真正需要返回的只是一个整数。
你需要类似(伪代码)的东西:
numberOfNumbers = 0;
while ( there is sth to handle )
{
take element to handle
try
{
check it
numberOfNumbers++;
}
catch ( )
{
// not a number
}
go to the next element
}
return numberOfNumbers
当然,假设isNumber在您的maybe数字不是数字时抛出一些execution。
试试这个:
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
foreach (var item in maybe)
{
Console.WriteLine(item);
}
ArrayList res = new ArrayList(maybe.ToArray().Where((o) => o.IsNumber()).ToArray());
foreach (var item in res)
{
Console.WriteLine(item);
}
}
public static bool IsNumber(this object item)
{
const TypeCode filter = TypeCode.Double | TypeCode.Int16 | TypeCode.Int32 | TypeCode.Int64
| TypeCode.Single | TypeCode.UInt16 | TypeCode.UInt32 | TypeCode.UInt64;
Type t = item.GetType();
if (t.IsPrimitive)
{
TypeCode code = System.Type.GetTypeCode(t);
return (code & filter) > 0;
}
return false;
}