列表只包含前两项

本文关键字:两项 包含前 列表 | 更新日期: 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;
}