2012-02-03 27 views
1

好吧,我很確定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; 
    } 
+0

這是什麼行的用意何在? for(;;){ – 2012-02-03 19:01:52

+0

無限循環? – Artur 2012-02-03 19:03:12

+0

當MoveNext失敗時,看起來像Catch抓住它。奇怪,男人。 – Almo 2012-02-03 19:04:34

回答

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)); 

確保您才能使用則IsNumeric引用添加到Microsoft.VisualBasic命名空間()

0
  • 擺脫無休止的循環
  • 迭代的通過你也許數字
  • 的環繞的try ... catch只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拋出一些execption當你也許號碼是不是一個數字的假設。

0

1.don't依靠的try/catch正常碼流。 try/catch語句在捕獲異常情況

您爲何需要建立一個ISNUMBER方法? double.tryParse或Convert.ToDouble()會做類似的事情(谷歌直到找到差異)

3.沒有ideaa什麼myAreNumbers應該做的,但你基本上添加一個布爾和列表到一個新的列表每次迭代

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; 
} 
1

像評議指出,返回值areNumbers將至多永遠是與2項的ArrayList(第一項將是布爾值的對於項0的ArrayList通N-2;第二個項目是第(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! 

如果你pre-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); 
} 
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; 
}