string result = String.Empty;
var list = new[]
{
new { Number = 10, Name = "Smith" },
new { Number = 10, Name = "John" }
}.ToList();
foreach (var item in list)
{
result += String.Format("Name={0}, Number={1}\n", item.Name, item.Number);
}
MessageBox.Show(result);
Dutt,你的代码应该在没有.ToList()的情况下工作. 好吧,现在我们需要一个用select语句替换new {}行的例子.var list = sourceList.Select(o => new {o.ModelId,o.PartNumber,o.Quantity}).ToList();
3> 小智..:
有很多方法可以做到这一点,但是这里的一些响应是创建一个包含垃圾元素的列表,这需要您清除列表.
如果要查找泛型类型的空列表,请使用"针对元组列表选择"来创建空列表.不会实例化任何元素.
这是创建空列表的单线程:
var emptyList = new List>()
.Select(t => new { Id = t.Item1, Name = t.Item2 }).ToList();
然后您可以使用您的泛型类型添加到它:
emptyList.Add(new { Id = 1, Name = "foo" });
emptyList.Add(new { Id = 2, Name = "bar" });
List CreateEmptyGenericList(T example) {
return new List();
}
void something() {
var o = new { Id = 1, Name = "foo" };
var emptyListOfAnonymousType = CreateEmptyGenericList(o);
}
将工作.
你也可以考虑这样写:
void something() {
var String = string.Emtpy;
var Integer = int.MinValue;
var emptyListOfAnonymousType = CreateEmptyGenericList(new { Id = Integer, Name = String });
}
6> Rostov..:
我通常使用以下内容; 主要是因为你然后用一个空的列表"开始".
var list = Enumerable.Range(0, 0).Select(e => new { ID = 1, Name = ""}).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );
//etc.
最近,我一直这样写它:
var list = Enumerable.Repeat(new { ID = 1, Name = "" }, 0).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );
使用repeat方法还可以执行以下操作:
var myObj = new { ID = 1, Name = "John" };
var list = Enumerable.Repeat(myObj, 1).ToList();
list.Add(new { ID = 2, Name = "Liana" });
var list = new[] { new { Id = 1, Name = "Foo" } }.ToList();
list.Add(new { Id = 2, Name = "Bar" });
8> MEC..:
我在几个答案上检查了IL.此代码有效地提供了一个空列表:
using System.Linq;
…
var list = new[]{new{Id = default(int), Name = default(string)}}.Skip(1).ToList();
9> 小智..:
在最新的4.0版本中,可以使用如下的动态
var list = new List();
list.Add(new {
Name = "Damith"
});
foreach(var item in list){
Console.WriteLine(item.Name);
}
}
10> user_v..:
这是我的尝试.
List
当我为自定义类型制作匿名列表时,我想出了类似的东西.
11> 小智..:
下面是另一种创建匿名类型列表的方法,它允许您从空列表开始,但仍然可以访问IntelliSense.
var items = "".Select( t => new {Id = 1, Name = "foo"} ).ToList();
如果你想保留第一个项目,只需在字符串中放一个字母.
var items = "1".Select( t => new {Id = 1, Name = "foo"} ).ToList();
12> Code Name Ja..:
您可以创建一个动态列表。
List anons=new List();
foreach (Model model in models)
{
var anon= new
{
Id = model.Id,
Name=model.Name
};
anons.Add(anon);
}
“动态”通过添加的第一个值进行初始化。
13> 小智..:
而不是这个:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List list = new List();
list.Add(o);
list.Add(o1);
你可以这样做:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List list = new List();
list.Add(o);
list.Add(o1);
但是,如果您尝试在另一个范围内执行此类操作,则会遇到编译时错误,尽管它在运行时有效:
private List GetList()
{
List list = new List();
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
list.Add(o);
list.Add(o1);
return list;
}
private void WriteList()
{
foreach (var item in GetList())
{
Console.WriteLine("Name={0}{1}", item.Name, Environment.NewLine);
}
}
问题是只有Object的成员在运行时可用,尽管intellisense将显示属性id和name.
在.net 4.0中,解决方案是在上面的代码中使用关键字dynamic istead of object.
另一种解决方案是使用反射来获取属性
using System;
using System.Collections.Generic;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
var anonymous = p.GetList(new[]{
new { Id = 1, Name = "Foo" },
new { Id = 2, Name = "Bar" }
});
p.WriteList(anonymous);
}
private List GetList(params T[] elements)
{
var a = TypeGenerator(elements);
return a;
}
public static List TypeGenerator(T[] at)
{
return new List(at);
}
private void WriteList(List elements)
{
PropertyInfo[] pi = typeof(T).GetProperties();
foreach (var el in elements)
{
foreach (var p in pi)
{
Console.WriteLine("{0}", p.GetValue(el, null));
}
}
Console.ReadLine();
}
}
}
14> 小智..:
var list = new[]{
new{
FirstField = default(string),
SecondField = default(int),
ThirdField = default(double)
}
}.ToList();
list.RemoveAt(0);