如何在 C# ASP.NET 中的单个 foreach 循环中组合两个列表
本文关键字:组合 列表 两个 循环 单个 ASP NET foreach | 更新日期: 2023-09-27 18:31:57
我有两个对象
-
List<string> ids;
-
List<string> names;
两者的长度/大小相同。
我想将它们显示为 foreach 循环中的超链接。我尝试在每个步骤中使用整数迭代来控制名称列表的索引。
int i = 0;
foreach (string id in ids)
{
body.InnerHtml += "<h2><a href='go.aspx?id=" + id + "'>"+ names[i++] +"</a></h2>";
}
这很有效,但是有更好的方法吗?
使用 Enumerable.Zip。这就是它的意义所在。
foreach (var item in ids.Zip(names, (id, name) => new { id, name }))
{
body.InnerHtml += "<h2><a href='go.aspx?id=" + item.id + "'>" + item.name + "</a></h2>";
}
我还推荐StringBuilder在循环中进行字符串连接。
如果您需要一起访问某些字段,则它们可能应该位于一起。我的意思是创建一个新类并将它们存储在一起。
class MyItem
{
public string Id {get; set;}
public string Name {get; set;}
}
然后使用 List<MyItem>
.如果你这样做,你不应该首先提出这个问题:)
如果您确实要使用 foreach
循环,请使用 LINQ(Zip 扩展方法)创建一个新集合并迭代该集合:
var combined = ids.Zip(names, (id, name) => new { id = id, name = name });
foreach(var c in combined)
{
body.InnerHtml += "<h2><a href='go.aspx?id=" + c.id + "'>"+ c.name +"</a></h2>"
}
一种可能的解决方案是使用 Linq 的 Zip 函数:
const string link = "<h2><a href='go.aspx?id={0}'>{1}</a></h2>";
body.InnerHtml += String.Concat(
ids.Zip(names, (id, name) => String.Format(link, id, name)));
另一种方法是使用具有总数的 for 循环。 例如:
int totalCount = listOfStringsA.Count + listOfStringsB.Count;
for (int count=0; count < totalCount; count++)
{
string item = null;
if (count < totalCount) item = listOfStringsA[count];
else item = listOfStringsB[count - totalCount];
// do whatever with item ...
}
为什么不使用for
循环?
for (int i = 0; i < ids.Count; i++)
{
body.InnerHtml += "<h2><a href='go.aspx?id=" + ids[i] + "'>"+ names[i] +"</a></h2>"
}