2012-02-03 2 views
1

좋아요, 나는 isNumber가 마침내 작동하고 있음을 확신합니다. 도움을 주신 모든 분들께 감사드립니다. 나는이 프로젝트에 대한 실제 작업을 시작할 준비가 거의 다되었다고 생각한다. 나는 머리 주위를 감싸는 중이다.목록에는 처음 두 항목 만 포함됩니다.

내가하고있는 일은 숫자 일 경우 많은 수의 입력을 한 번에 확인하고 그 결과를 목록에 저장하는 것입니다. 그런 식으로 그들 중 하나가 숫자인지 알아 내려면 두 번째 목록에서 해당 값을 확인하면됩니다.

내 문제는 명확하게 3 가지를 내 목록에 넣고 있지만 항상 표시되는 항목의 수를 인쇄하면됩니다.이 도대체 무엇이 잘못 되었습니까? 특히, 적어도 numberOfNumbers만큼 오래 걸리면 areNumbers는 항상 길이 2의 목록을 반환합니까?

추신 : 나는 내 코드가 아직 잘 보이지 않는다는 것을 알고있다. 스타일에 대해 배우기 전에 바로 기본을 배우고 싶습니다.

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

MoveNext가 실패 할 때 Catch가 잡는 것처럼 보입니다. 이상 하네. – 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)); 

당신이 ISNUMERIC를 사용하기 위해 Microsoft.VisualBasic 네임 스페이스에 대한 참조를 추가합니다()

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을 던져 물론 가정 :

당신은 (의사 코드)와 같은 STH가 필요합니다.

0

정상적인 코드 흐름을 위해 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; 
} 
1

은 가장 적 (제 1 항목은 N-2 통해 상품 0 불리언 ArrayList를 것 2 개 항목 ArrayList를 것, 반환 값 areNumbers 명시된 두 번째 항목이 될 (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 

당신이 숫자였다 넷째 값으로 호출한다면 :

 
areNumbers[0]: [[[[], true], false], true] 
areNumbers[1]: true 
01 23,516,

은 이제 희망이 사전 제네릭에 붙어 있지 & 사전 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); 
} 
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; 
} 
관련 문제