2012-05-21 4 views
2
using System; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 

namespace LearningJustCode 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Update(); 
     } 

     static void Update() 
     { 
      var quote1 = new { Stock = "DELL", Quote = GetQuote("DELL") }; 
      var quote2 = new { Stock = "MSFT", Quote = GetQuote("MSFT") }; 
      var quote3 = new { Stock = "GOOG", Quote = GetQuote("GOOG") }; 

      var quotes = new object[] { quote1, quote2, quote3 }; 

      foreach (var item in quotes) 
      { 
       Console.WriteLine(item.Stock); 
       Console.WriteLine(item.Quote.ToString()); 
      } 
     Console.ReadKey(); 

     } 

     static string GetQuote(string stock) 
     { 
      try 
      { 
       return InnerGetQuote(stock); 
      } 
      catch (Exception ex) 
      { 

       Console.WriteLine(ex.Message); 
       return "N/A"; 
      } 
     } 

     static string InnerGetQuote(string stock) 
     { 
      string url = @"http://www.webservicex.net/stockquote.asmx/GetQuote?symbol={0}"; 
      var request = HttpWebRequest.Create(string.Format(url, stock)); 

      using (var response = request.GetResponse()) 
      { 
       using (var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII)) 
       { 
        return reader.ReadToEnd(); 
       } 
      } 


     } 
    } 
} 

변수에 'squiggley'가 지정됩니다. 'item'변수에만 할당됩니다. 이 코드는 Paul Kimmel의 책 C# Unleashed from Sams에서 약간 수정되었습니다.익명 형식의 foreach

var quotes = new object[] { quote1, quote2, quote3 }; 

따옴표는 객체 배열이 아닌 익명 형식의 배열입니다 :

+3

어떨까요? – zerkms

+0

foreach 루프에서 코드를 생략 했습니까? –

+0

그래, 당신은 iterating하고 있지만 항목으로 아무것도하지 마십시오. 따라서 할당 된 것입니다. –

답변

3

배열의 주식 시세 유형이 필요합니다. 주식 시세는 익명 형식이기 때문에 배열을 익명으로 정의해야합니다. 다음과 같이 깨끗하게 처리 할 수 ​​있습니다.

var quotes = new[]{ new { Stock = "DELL", Quote = "123" }, 
         new { Stock = "MSFT", Quote = "123" }, 
         new { Stock = "GOOG", Quote = "123" }}; 

    foreach (var item in quotes) 
    { 
     Console.WriteLine(item.Stock); 
     Console.WriteLine(item.Quote.ToString()); 
    } 
+0

그건 더 깨끗해, 고마워! – dannyrosalex

+0

길이가 알려지지 않은 배열에서 요소를 가져 오는 경우 어떻게됩니까? 2 개의 배열에서 상품 (주식 및 견적 포함)을 동적으로 정의 할 수 있습니까? – C4u

4

내가 문제가 그 라인에있는 것 같다. foreach에는 객체 값만 있습니다. 당신은 하나 개의 라인 내에서 또는 A 매우 더러운 해결 방법은 '

 var quote1 = new { Stock = "DELL", Quote = ("DELL") }; 
     var quote2 = new { Stock = "MSFT", Quote = ("MSFT") }; 
     var quote3 = new { Stock = "GOOG", Quote = ("GOOG") }; 

     var quotes = new object[] { quote1, quote2, quote3 }; 

     foreach (dynamic item in quotes) 
     { 
      var r = item.Stock; 

     } 

깨끗한 솔루션은 밖으로 떠나는'동적 '에'VAR을 '변화되는 람다 식

내에서 배열을 형성하기 위해 시도 할 수 객체 '이므로 컴파일러에서 익명의 형식화 된 배열을 생성 할 수 있습니다.

 var quote1 = new { Stock = "DELL", Quote = ("DELL") }; 
     var quote2 = new { Stock = "MSFT", Quote = ("MSFT") }; 
     var quote3 = new { Stock = "GOOG", Quote = ("GOOG") }; 

     var quotes = new [] { quote1, quote2, quote3 }; 

     foreach (var item in quotes) 
     { 
      var r = item.Stock; 

     } 
+0

더러운 해결 방법 : "var"을 "dynamic"으로 변경하십시오. – user287107

+0

나를 쓰레기로 보내 주셔서 감사합니다. 다른 응답자는 태도에 문제가 있습니다! 당신이 제안한 것을 구현하는 방법을 모릅니다. – dannyrosalex

+0

충분히 쉽습니다. 고마워요! – dannyrosalex

관련 문제