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