Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匿名类型上的foreach_C#_Foreach_Anonymous - Fatal编程技术网

C# 匿名类型上的foreach

C# 匿名类型上的foreach,c#,foreach,anonymous,C#,Foreach,Anonymous,我在这件事上有点不对劲;变量“item”仅分配给。这段代码从Paul Kimmel的《Sams释放的C#》一书中稍作修改 我想问题就在这一行: using System; using System.Linq; using System.Text; using System.Net; using System.IO; namespace LearningJustCode { class Program { static void Main(string[] arg

我在这件事上有点不对劲;变量“item”仅分配给。这段代码从Paul Kimmel的《Sams释放的C#》一书中稍作修改

我想问题就在这一行:

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


        }
    }
}
quotes是一个对象数组,不是那种匿名类型的数组。foreach也只有对象值。您可以尝试在一行或lambda表达式中形成数组

非常肮脏的解决方法是将“var”更改为“dynamic”

var quotes = new object[] { quote1, quote2, quote3 };
一个更干净的解决方案是省略“object”,这样编译器就可以生成一个匿名类型的数组

        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;

        }

您是否在foreach循环中遗漏了代码?是的,您正在迭代,但从未对该项执行任何操作。因此,仅分配。该消息表示从不使用仅存在于该循环范围内的
。也就是说,它是多余的和不必要的。当普通类型似乎合适时,为什么要使用匿名类型?这是一个警告,您分配了变量,但从未使用过它(因为它是一个空foreach)。谢谢您没有贬低我。其他响应者有态度问题!不知道如何实现您的建议。但这似乎很愚蠢;)更好地利用类型推断并执行
var quotes=new[]{quote1,quote2,quote3}。这样,您就可以在foreach循环中保留
var
关键字。编辑:好的,我收回。看到您的编辑;)如果我的元素来自长度未知的数组怎么办?是否可以从2个数组中动态定义项目(包括库存和报价)?
    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());
    }