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» присваивается значение. Этот код был слегка изменен из книги Пола Киммеля C# Unleashed от Sams.foreach over anonymous types

+3

Как насчет вопроса? – zerkms

+0

Вы не оставили код в своей петле foreach? –

+0

Ну да, вы повторяете, но ничего не делаете с предметом. Следовательно, назначается только. –

ответ

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

я думаю, что проблема в этой строке:

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

котировки является массив объектов, а не массив этого анонимного типа. foreach также имеет только значение объекта. Вы могли бы попытаться сформировать массив в одной строке или в лямбда-выражения

очень загрязнен обходной путь меняется «вар» до «динамических»

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

Смежные вопросы