2012-02-03 3 views
1

Хорошо, я уверен, что isNumber, наконец, работает. Спасибо всем за помощь. Я думаю, что я почти готов начать работу над этим проектом по-настоящему. Я просто пытаюсь обвести голову списками.Список содержит только первые два элемента:

Что я делаю, это попытка проверить кучу вводов сразу, если они являются числами и сохранять результаты в списке. Таким образом, чтобы узнать, является ли один из них числом, я могу просто проверить соответствующее значение во втором списке, чтобы узнать.

Итак, моя проблема в том, что я четко помещаю 3 вещи в свой список, но когда у меня есть распечатка, количество элементов всегда отображает 2. Что, черт возьми, не так с этим? В частности, почему isNumbers всегда возвращают список длины 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 (;;) { –

+0

бесконечный цикл? – Artur

+0

Похоже, Catch захватывает его, когда MoveNext терпит неудачу. Странно, мужик. – Almo

ответ

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

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 проливает некоторый execption, когда ваш номер может быть не число.

0

1. Не полагайтесь на попытку/уловку для нормального потока кода. try/catch предназначен для обнаружения исключительных ситуаций

2.Что вам нужно для создания метода isNumber? double.tryParse или Convert.ToDouble() будут делать похожие вещи (google, чтобы найти разницу)

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

Как комментаторам указано, возвращаемое значение areNumbers будет самое когда-либо быть ArrayList с 2 элементов (первый элемент был бы ArrayList логических значений для элементов 0 через 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! 

Если вы предварительно 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-дженерики (не может скомпилировать ...)

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; 
} 
Смежные вопросы