我想将Foreach中的以下代码转换为Linq

时间:2017-09-27 08:23:07

标签: c# asp.net linq

StringBuilder sb = new StringBuilder();
foreach (DataRow dr in ds.Tables[0].Rows)
{
    sb.Append(@"<div class='item'> <img class='img-responsive' src='images/gallary/"+ dr["Image_name"].ToString() + @"'  height='140' width='180' />
        <h2>Lorem Ipspspsum</h2>
      </div> ");
}

为每个循环使用此功能,我可以动态地将图像添加到从数据库中检索的网页。这个循环可以转换为Linq吗?如果是,那怎么样?

2 个答案:

答案 0 :(得分:1)

我不明白为什么要改用linq解决方案。 IMO它不是更具可读性但是这样做:使用.Select进行循环,string.Concat将所有字​​符串组合在一起:

var result = string.Concat(ds.Tables[0].Rows.Select(dr => 
    @"<div class='item'> <img class='img-responsive' src='images/gallary/"+ dr["Image_name"].ToString() + @"'  height='140' width='180' /><h2>Lorem Ipspspsum</h2></div> "));

此外,你可以这样使用字符串插值:

var result = string.Concat(ds.Tables[0].Rows.Select(dr => 
    $@"<div class='item'> <img class='img-responsive' src='images/gallary/{dr["Image_name"].ToString()}'  height='140' width='180' /><h2>Lorem Ipspspsum</h2></div> "));

我可能会在任何情况下添加字符串插值,即使没有将其更改为linq解决方案

答案 1 :(得分:0)

有很多方法可以做到这一点,但在我看来,Aggregate将是'最流行的'(与其他语言中的reduce相同)。 Aggregate旨在将多个对象映射到单个对象,并且由于您正在将行数组转换为单个StringBuilder,因此这将执行您想要的操作。关于其他解决方案,他们的工作和良好,但我会说Aggregate(或Reduce)是最有效的方式,因为它是所有功能中最具功能性的解决方案(但这并不意味着更好)。

ds.Tables[0].Rows.Aggregate(new StringBuilder(), (a, dr) => a.Append(@"<div class='item'> <img class='img-responsive' src='images/gallary/"+ dr["Image_name"].ToString() + @"'  height='140' width='180' />
        <h2>Lorem Ipspspsum</h2>
      </div> "));

但这样做会更好吗,不会与你的代码完全相同。