当前位置:  开发笔记 > 编程语言 > 正文

如何以更好的方式写这个?

如何解决《如何以更好的方式写这个?》经验,为你挑选了2个好方法。

我们来看看这段代码:

IList list = 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(但让我知道如何)?

提前致谢!



1> Adam Robinso..:

仅供参考,您永远不会将新内容添加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的复杂性,但应该为您完成.



2> dthorpe..:

你可以在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();

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有