我们来看看这段代码:
IListlist = new List (); var table = adapter.GetData(); //get data from repository object -> DataTable if (table.Rows.Count >= 1) { for (int i = 0; i < table.Rows.Count; i++) { var anno = new HouseAnnouncement(); anno.Area = float.Parse(table.Rows[i][table.areaColumn].ToString()); anno.City = table.Rows[i][table.cityColumn].ToString(); list.Add(anno); } } return list;
用更少的代码和更好的方式(必须是:-))写出这个更好的方法吗?也许使用lambda(但让我知道如何)?
提前致谢!
仅供参考,您永远不会将新内容添加HouseAnnouncement
到列表中,并且您的循环将永远不会执行最后一行,但我假设这些是示例中的错误而不是实际代码中的错误.
你可以这样做:
return adapter.GetData().Rows.Cast().Select(row => new HouseAnnouncement() { Area = Convert.ToSingle(row["powierzchnia"]), City = (string)row["miasto"], }).ToList();
我通常为了简洁而可读性,但我觉得这很可读.
请注意,虽然你仍然DataTable
可以table.powierzchniaColumn
在lambda中缓存和使用,但我没有使用它,因此你没有使用一个非常必要的闭包(闭包会给lambda的内部实现带来很大的复杂性,所以如果可能).
如果您按原样保留列引用很重要,那么您可以这样做:
using (var table = adapter.GetData()) { return table.Rows.Cast().Select(row => new HouseAnnouncement() { Area = Convert.ToSingle(row[table.powierzchniaColumn]), City = (string)row[table.miastoColumn], }).ToList(); }
这会增加编译器生成的实际IL的复杂性,但应该为您完成.
你可以在Linq做这样的事情:
var table = adapter.GetData(); var q = from row in table.Rows.Cast() select new HouseAnnouncement() { Area = float.Parse(row[table.areaColumn].ToString()), City = row[table.cityColumn].ToString() }; return q.ToList();