匿名类型列表?

6

我需要创建一些配对/三元组,并将其存储在某个地方。我该怎么做?

我尝试过:

for (int i = 0; i < 100; i++)
{
    var item=new { a=i , b="lala" ,c=4.5m}; //anonymous type
}

但是我想: List<什么>

我可以使用动态类型,但我想要智能感知。

(我也可以使用 Tuple<int,string,decimal>,但如果我已经有了我需要的东西 (=new { a=i , b="lala" ,c=4.5m};),为什么要使用其他类型(元组)?)

有没有解决方案?


1
你已经发现了匿名类型的缺点:它们没有名称(在静态类型上下文中无法使用)。只有隐式类型推断可以与它们一起使用(或者当然可以扩展到Object/dynamic)。这就是为什么较新的.NET版本添加了Tuple类 - Tuple类型名称,并且可以跨越类型推断无法通过的边界。 - user166390
2
这基本上就是 Tuple<> 的设计目的。 - Alex
2
@flup 我相信这是与 List<object> theList = .. 相关的,因为 var theList = .. 会被正确识别。 - user166390
1
无论如何,参见 https://msmvps.com/blogs/jon_skeet/archive/2009/01/09/horrible-grotty-hack-returning-an-anonymous-type-instance.aspx (虽然很丑陋,但是...) - user166390
可能是A generic list of anonymous class的重复问题。 - nawfal
显示剩余5条评论
3个回答

13

你可以使用类型推断

var items = Enumerable.Range(0,100)
                      .Select(i => new { a=i , b="lala", c=4.5m })
                      .ToList(); // not necessary (you can use IEnumerable)

@RoyiNamir 抱歉,我不明白你所说的“captured var issue”是什么意思。如果您想多次使用项目,则最好使用 ToList()ToArray()。如果您只想对项目进行一次迭代,则只需使用匿名类型的 IEnumerable<T>(进一步枚举将创建新项目)。这就是为什么我在 ToList() 上添加了那个注释的原因。 - Sergey Berezovskiy

3

不确定您如何在for中填写字段,但是您可以尝试:

var lstOfSmth = Enumerable.Range(0, 100)
                            .Select(i => new { a = i, b = "lala", c = 4.5m })
                            .ToList();

2

为什么我应该使用其他类型(元组)

因为它们专门为此目的而设计。如果你担心代码冗长,using 指令也可以帮助你解决问题。

using myPair = Tuple<int,string>;
using myTriple = Tuple<int,string,decimal>;
//...
for (int i = 0; i < 100; i++)
{
    myPair pair = new myPair(1,"string");
    myTriple triple = new myTriple(i,"lala", 4.5);
}

2
Alex - 4.5m 不是一种度量单位(它不是米)。这会强制将 4.5 视为小数,而不是浮点数,在数值上有很大的区别。 - Eilon
哦,真遗憾我错过了。我会把事情修复好的。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接