列表仅包含前两项

时间:2012-02-03 18:58:55

标签: c# list

好的,我很确定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;
    } 

5 个答案:

答案 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)

  • 摆脱无限循环
  • 遍历你的数字
  • 环绕尝试...仅捕获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会抛出一些执行。

答案 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;
}
相关问题