代码之家  ›  专栏  ›  技术社区  ›  Velocoder

如何写得更好?

  •  3
  • Velocoder  · 技术社区  · 14 年前

    让我们看看这个代码:

    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;
    

    提前谢谢!

    7 回复  |  直到 14 年前
        1
  •  9
  •   David Clarke    13 年前

    仅供参考,你永远不会添加新的 HouseAnnouncement 你的循环将永远不会在 最后的 行,但我假设这些是示例中的错误,而不是实际代码中的错误。

    你可以这样做:

    return adapter.GetData().Rows.Cast<DataRow>().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<DataRow>().Select(row =>
            new HouseAnnouncement()
            {
                Area = Convert.ToSingle(row[table.powierzchniaColumn]),
                City = (string)row[table.miastoColumn],
            }).ToList();
    }
    

    这将增加编译器生成的实际IL的复杂性,但应该可以帮到您。

        2
  •  5
  •   dthorpe    14 年前

    您可以在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();
    
        3
  •  2
  •   Kevin Crowell    14 年前

    for (int i = 0; i < table.Rows.Count; i++)
    
        4
  •  1
  •   Ryan Lundy    14 年前

    for (int i = 0; i < table.Rows.Count - 1; i++)
    {
    }
    

    如果您的表有三行,这将在 i 小于3-1或2,这意味着它将对第0行和第1行运行,但不会对第2行运行。这可能不是您想要的。

        5
  •  1
  •   AareP    14 年前

    var table = adapter.GetData(); //get data from repository object -> DataTable
    IList<IHouseAnnouncement> list = new List<IHouseAnnouncement>(table.Rows.Count);
    
    for (int i = 0; i < list.Length; i++)
    {
       list[i] = new HouseAnnouncement();
       list[i].Area = float.Parse(table.Rows[i][table.areaColumn].ToString());
       list[i].City = table.Rows[i][table.cityColumn].ToString();
    }
    
    return list;
    

    它比linq版本需要更多的字符,但是程序员的大脑对它的解析速度更快

        6
  •  0
  •   Muad'Dib    14 年前

    对我来说,可读性比简洁的代码要好——只要性能不是牺牲品。另外,我相信以后需要维护代码的人也会很感激的。
    即使是在维护自己的代码时,我也不想看着它,比如说几个月后,想“我到底想完成什么?”

        7
  •  0
  •   Ken    14 年前

    我可能会这样做:

    var table = adapter.GetData(); //get data from repository object -> DataTable
    
    return table.Rows.Take(table.Rows.Count-1).Select(row => new HouseAnnouncement() {
        Area = float.Parse(row[table.powierzchniaColumn].ToString()),
        City = row[table.miastoColumn].ToString()
    }).ToList();