Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以更好的方式书写?_C#_Design Patterns_Lambda - Fatal编程技术网

C# 如何以更好的方式书写?

C# 如何以更好的方式书写?,c#,design-patterns,lambda,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++

让我们看看这段代码:

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;
IList list=new list();
var table=adapter.GetData()//从存储库对象->数据表获取数据
如果(table.Rows.Count>=1)
{
for(int i=0;i
用更少的代码和更好的方式写这篇文章(必须是:-)更好吗?也许使用lambda(但请告诉我如何使用)


提前谢谢

对我来说,可读性比代码简洁更可取——只要性能不是牺牲品。另外,我相信以后需要维护代码的人也会很感激的。

即使在我维护自己的代码时,我也不想看它,比如说几个月后,想“我到底想完成什么”

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


你可以这样做:

return adapter.GetData().Rows.Cast<DataRow>().Select(row =>
    new HouseAnnouncement()
    {
        Area = Convert.ToSingle(row["powierzchnia"]),
        City = (string)row["miasto"],
    }).ToList();
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();
}
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();
这将增加编译器生成的实际IL的复杂性,但应该为您做到这一点。

您的“if语句”是不必要的。你的“for循环”已经解决了这个问题

此外,当表行数为1时,将不会执行“for循环”。这似乎是个错误,不是故意的,但我可能错了。如果要解决此问题,只需取出“-1”:

for(int i=0;i
首先,您似乎出现了一个“关闭一次”错误:

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

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

我可能会这样做:

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

您可以在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();
var table=adapter.GetData();
var q=来自表.Rows.Cast()中的行
选择new House Announcement()
{Area=float.Parse(行[table.areaColumn].ToString()),
City=行[table.cityColumn].ToString()
};
返回q.ToList();

比for循环和no if语句简单得多:

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;
var table=adapter.GetData()//从存储库对象->数据表获取数据
IList list=新列表(table.Rows.Count);
for(int i=0;i

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

这将是最简洁、最有表现力、最优雅的解决方案。不幸的是,它无法编译
DataTable.Rows
没有实现
IEnumerable
,因此您必须调用
Cast()
才能对其进行查询。即便如此,我也看不出它有多么简洁(因为它是三条语句,而不是两条)。此外,你检索了两次数据。同意亚当·罗宾逊的说法,不会编译。好吧,你让我了解演员阵容问题。伪代码。我的观点是,有些人更喜欢Linq语法的外观/可读性,而不是显式方法调用链——这正是Linq编译的目的。另外,dario,如果可能的话,看看你是否能让你的方法返回一个IEnumerable,然后如果消费者愿意,你可以让他们将它转换到一个列表中。您可以通过将lambda返回值强制转换为IHouseAnnouncement或使用
as
“将其转换为列表”=“将其转换为列表”方法使其返回IEnumerable。方法:Rows.cast()不apear且不会编译。@dario:您使用的是.NET 3.5吗?如果是这样,请确保
using System.Linq
与其他
using
语句一起出现在文件的顶部。@Adam Robinson。我的错,谢谢你的小费。但我看到在您的解决方案中,我丢失了字符串表示的强列名。有可能解决这个问题吗?