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

标签 c# design-patterns lambda

让我们看一下这段代码:

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;

用更少的代码和更好的方式编写它是否更好(必须是:-))?也许使用 lambda(但让我知道如何使用)?

提前致谢!

最佳答案

仅供引用,您永远不会将新的 HouseAnnouncement 添加到您的列表中,并且您的循环永远不会为 last 行执行,但我假设那些是示例中的错误,而不是实际代码中的错误。

你可以这样做:

return adapter.GetData().Rows.Cast<DataRow>().Select(row =>
    new HouseAnnouncement()
    {
        Area = Convert.ToSingle(row["powierzchnia"]),
        City = (string)row["miasto"],
    }).ToList();

我通常追求可读性而不是简洁,但我觉得这非常可读。

请注意,虽然您仍然可以缓存 DataTable 并在 lambda 中使用 table.powierzchniaColumn,但我删除了它,这样您就不会使用一个闭包真的没有必要(闭包给 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 的复杂性,但应该可以解决问题。

关于c# - 如何以更好的方式写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587367/

相关文章:

c# - 如何引用 Windows.Gaming.Input 命名空间

python - 这个用于排序数字的 lambda 如何工作?

python 3.4 : lambda function using a list

c# - Xamarin 在哪里执行绑定(bind)表达式?

WCF/.NET 中的 C# UTC 日期时间查询

c# - Azure Blob 是否过滤 Blob 名称的 "prefix"?

c++ - 图元的实现复合模式示例

java - 如何设计一个模型来允许应用或取消更新?

c++ - 允许在应用程序级别挂载的文件系统库

c# - 带有构造函数参数的 lambda 的 RelayCommand