如何在 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>";
}

这很有效,但是有更好的方法吗?

如何在 C# ASP.NET 中的单个 foreach 循环中组合两个列表

使用 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>"
}