好的,我很确定isNumber终于有效了。感谢大家的帮助。我想我已经准备好开始真正开展这个项目了。我只是想把头脑包围起来。
我正在做的是尝试一次检查一堆输入,如果它们是数字并将结果存储在列表中。这样,为了找出其中一个是否是数字,我可以检查第二个列表中的相应值来查找。
所以,我的问题是我清楚地在我的列表中放了3个东西,但是当我打印出它总是显示的项目数时2.这有什么问题呢?具体来说,为什么当我显然至少和numberOfNumbers一样长时,areNumbers总是返回长度为2的列表?
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;
}
答案 0 :(得分:1)
与评论者所说的一样,返回值areNumbers
最多只能是一个包含2个项目的ArrayList(第一个项目是项目0到N-2的布尔值的ArrayList;第二个项目是布尔值第(N-1)个值的值)。如果我正确地浏览了我的头部代码,如果你发送一个空的ArrayList,你会得到一个空的ArrayList。
一件事后:
areNumbers[0]: [] // empty ArrayList areNumbers[1]: true
两件事后:
areNumbers[0]: [[], true] // after first item areNumbers[1]: false
经过三个项目
areNumbers[0]: [[[], true], false] // after second item areNumbers[1]: true
如果要使用数字的第4个值调用:
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);
}
Pre-generics(可能无法编译......)
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);
}
答案 1 :(得分:0)
如果有异常请勿增加数字。 并且不要为此返回泛型,因为您真正需要返回的只是整数。
你需要......(伪代码):
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会抛出一些执行。
答案 2 :(得分:0)
1.don依靠try / catch来获得正常的代码流。 try / catch用于捕捉异常情况
2.为什么需要构建一个isNumber方法? double.tryParse或Convert.ToDouble()会做类似的事情(google up to find the difference)
3.No ideea 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;
}
答案 3 :(得分:0)
这将循环通过一个对象列表并给你一个布尔响应,让你知道它们是否是数字,我认为这是你的代码最终在做什么。
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()
答案 4 :(得分:0)
试试这个:
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;
}