Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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# 将对象转换为匿名类型的IEnumerable_C#_Linq_System.reactive_Anonymous Types - Fatal编程技术网

C# 将对象转换为匿名类型的IEnumerable

C# 将对象转换为匿名类型的IEnumerable,c#,linq,system.reactive,anonymous-types,C#,Linq,System.reactive,Anonymous Types,如何迭代作为(first,second,third)=>new{One=first,Two=second,Three=third}下的对象传入的匿名类型 如果我询问消息类型并打印它,它会显示:f_uanonymoustype0 3[MtApi.MtQuote,MtApi.MtQuote,MtApi.MtQuote] //**How do I convert an object to the anonymous type?** static void ShowAnonymousTypeMessag

如何迭代作为
(first,second,third)=>new{One=first,Two=second,Three=third}下的对象传入的
匿名类型

如果我询问消息类型并打印它,它会显示:
f_uanonymoustype0 3[MtApi.MtQuote,MtApi.MtQuote,MtApi.MtQuote]

//**How do I convert an object to the anonymous type?**
static void ShowAnonymousTypeMessage(object message)
{    

    foreach(var quote in message)
    Console.WriteLine(
        quote.Instrument + ": " + quote.Bid.ToString() + quote.Ask.ToString());
}


匿名类型不打算被传递,您应该只在绝对必要时使用对象。此外,您不能对匿名类型进行迭代-您应该使用
数组

var pattern = observable1.And(observable2).And(observable3);
var plan = pattern.Then((first, second, third) => new[] { first, second, third });
var zippedSequence = Observable.When(plan);
zippedSequence.Subscribe(
    ShowAnonymousTypeMessage                
);

这对我有用:

static void Main()
{
    var anon = new { Name = "Terry", Age = 34 };
    test(anon);
}

static void test(dynamic t)
{
    Console.WriteLine(t.Age);
    Console.WriteLine(t.Name);
}

匿名类型不应该被传递,这与我们在C#中使用强类型的原因完全相同:编译器不会犯粗心的错误或忘记事情,我们经常这样做。如果您的匿名类实例正在离开创建它们的范围,那么是时候让它们成长为一个真正的类了

通常我会说您应该编写一个具有适当属性的quickie类(猜测此处的属性类型):

但是,如果您有像
One
Two
Two
这样的属性名,那么
元组实际上也同样好:

public static void Main()
{
    var x = Enumerable.Range(0, 10).Select(n => new Tuple<int, string>(n, $"Item {n + 1}"));

    Test(x);
}

private static void Test(IEnumerable<Tuple<int, string>> stuff)
{
    foreach (var item in stuff)
    {
        Console.Write($"{item.Item1}: {item.Item2}");
    }
}

好的,虎钳夹也不总是错误的工具。但很少有比这更好的了

你能设置一个断点并询问模式,看看它是什么类型,以及它是否实现了IEnumerable吗?在C#@kevin中,见原始的后期编程指南中说,不能将方法、属性、构造函数或索引器的形式参数声明为匿名类型。要传递匿名类型。。。作为方法的参数,可以将参数声明为类型对象。然而,这样做违背了强类型的目的。如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类,而不是匿名类型。“@ ED是的,元组将工作,因为这是很容易处理的。如果您有几个不只是一个?”@伊凡>代码>空洞测试(动态D){PROACH(动态项D){/*THEATE*/}。
--经过测试,效果很好。啊哈!谢谢,这就是我所缺少的。@Ivan,但看在上帝的份上,写一个快速类,或者至少使用一个元组。或者也许是Road Kill
public class Thing {
    public String One { get; set; }
    public String Two { get; set; }
    public String Three { get; set; }
}
public static void Main()
{
    var x = Enumerable.Range(0, 10).Select(n => new Tuple<int, string>(n, $"Item {n + 1}"));

    Test(x);
}

private static void Test(IEnumerable<Tuple<int, string>> stuff)
{
    foreach (var item in stuff)
    {
        Console.Write($"{item.Item1}: {item.Item2}");
    }
}
public static Main()
{
    var x = Enumerable.Range(0, 10).Select(n => new { ID = n, Value = $"Item {n + 1}" });

    Test(x);
}

private static void Test(dynamic message)
{
    foreach (dynamic item in message)
    {
        Console.Write($"{item.ID}: {item.Value}");
    }
}