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。我的错,谢谢你的小费。但我看到在您的解决方案中,我丢失了字符串表示的强列名。有可能解决这个问题吗?