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