课程:
class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
列表
List<Foo> lst = new List<Foo>();
数据表:
DataTable dt = GetFromDb ()....
我希望lst
填写dt
的记录。
我做过:
Array.ForEach(dt.AsEnumerable().ToArray(), y = > lst.Add(new Foo()
{
Id = int.Parse(y["id"].ToString()), Name = y["name"].ToString()
}));
问题:
dt.AsEnumerable().Select(_ => fill lst )
? 我知道选择签名的一部分(在这种情况下)是Func<datarow,void>
,它不会编译
但是,除了我的丑陋方式之外,还有其他方法吗?
答案 0 :(得分:7)
试试这个
var fooList = (from t in dt.AsEnumerable()
select new Foo { Id = t.Field<int>("Id"),
Name= t.Field<string>("Name") }).ToList();
DataTable上的AsEnumerable扩展方法将返回DataRows集合。然后使用必填字段从Linq结果中进行投影。由于它是dataRow类型,因此您需要指定每个列类型的内容。
答案 1 :(得分:7)
var foos = from row in dt.AsEnumerable()
select new Foo()
{
Id = row.Field<int>("id"),
Name = row.Field<string>("name")
};
// create a new list
List<Foo> lst = foos.ToList();
// update: add items to an exisiting list
fooList.AddRange(foos);
答案 2 :(得分:4)
您走在正确的轨道上,您可以执行以下操作:
lst = dt.AsEnumerable().Select(y = > new Foo()
{
Id = Convert.ToInt32(y["id"]), Name = y["name"] as string
}).ToList();
编辑:添加到现有列表
我通常会连接两个列表:
lst = lst.Concat(dt.AsEnumerable().Select(...)).ToList();
但是看过ken2k的回答后,我想我现在开始使用AddRange
了。
答案 3 :(得分:2)
你可以这样做:
List<Foo> lst = dt.AsEnumerable().Select(z => new Foo
{
Id = int.Parse(z["id"].ToString()),
Name = z["name"].ToString()
}).ToList();
编辑:
如果要附加到现有的List<Foo>
实例:
lst.AddRange(dt.AsEnumerable().Select(z => new Foo
{
Id = int.Parse(z["id"].ToString()),
Name = z["name"].ToString()
}));
答案 4 :(得分:1)
我通过Rows属性获得了另一个解决方案:
List<Foo> results = (from DataRow myRow in dt.Rows
select new Foo()
{
Id =int.Parse( row["id"].ToString()),
Name = row["name"].ToString()
}).ToList();