我一直想知道如何打破foreach循环,我可以在不经过存储在其中的整个元素的情况下获得输出。我的问题是,每当我使用break语句来停止获取第二个元素时,第一个元素也会出现。就像你只想得到第二个元素一样,作为回报它会显示第一个元素和第二个元素。我只希望第二个元素出现。
为了更好地解释这一点,这是我的代码:
public partial class Pages_GuitarItemsIbanezDetails : System.Web.UI.Page
{
private string guitarBrandType = "Ibanez";
private int x = 0;
protected void Page_Load(object sender, EventArgs e)
{
FillPage();
}
public void FillPage()
{
ArrayList itemDetails = new ArrayList();
if (!IsPostBack)
{
itemDetails = ConnectionClass.GetItems("%");
}
else
{
itemDetails = ConnectionClass.GetItems(guitarBrandType);
}
StringBuilder sb = new StringBuilder();
foreach (GuitarItems gList in itemDetails)
{
sb.Append(
string.Format(
@"<div class='guitarItemsDetailsWrapper'>
<div class='guitarItemsDetailsImage'>
<img runat='server' src='{3}' />
</div>
<div class='guitarItemsDetailsStyle'>
<h2>Name: </h2><p>{0} {1}</p>
<br/>
<h2>Price: </h2><p>${2}</p>
<br/>
<h2>Description: </h2><p>{4}</p>
<br/>
<h2>Neck Type: </h2><p>{5}</p>
<br/>
<h2>Body: </h2><p>{6}</p>
<br/>
<h2>Fretboard: </h2><p>{7}</p>
<br/>
<h2>Bridge: </h2><p>{8}</p>
<br/>
<h2>Neck Pickup: </h2><p>{9}</p>
<br/>
<h2>Bridge Pickup: </h2><p>{10}</p>
<br/>
<h2>Hardware Color: </h2><p>{11}</p>
<br/>
</div>
</div>", gList.Type, gList.Model, gList.Price, gList.Image2, gList.Description, gList.NeckType,
gList.Body, gList.Fretboard, gList.Bridge, gList.NeckPickup, gList.BridgePickup, gList.HardwareColor));
if (++x == 2)
{
break;
}
}
lblOutput.Text = sb.ToString();
}
}
正如你在我的foreach循环部分中看到的那样。我尝试使用if语句从第3个循环中断开它,因此它可以显示第2个元素,但相反,它将显示第1个元素和第2个元素。希望你们能帮助我展示第二个元素。随意编辑并建议更好的代码技术。
答案 0 :(得分:1)
你可以尝试这样的事情(尽管不是正确的方法)。如果不是2,则继续循环(在你追加之前)。请查看这个
foreach (GuitarItems gList in itemDetails)
{
if (x != 2)
{
x++;
continue;
}
sb.Append(
string.Format(
@"<div class='guitarItemsDetailsWrapper'>
....
</div>", gList.Type, gList.Model, gList.Price, gList.Image2, gList.Description, gList.NeckType,
gList.Body, gList.Fretboard, gList.Bridge, gList.NeckPickup, gList.BridgePickup, gList.HardwareColor));
if (x == 2)
{
break;
}
x++;
}
是的,上面是使用foreach
循环只是为了通过索引获取特定项目的可怕解决方案。有人指出问题是,每个循环触发你的sb.Append
(在你打破它之前)。为了解决这个问题,我们可以在continue
代码之前使用sb.Append
来跳过当前迭代(这很有用,但在这种情况下不是这样)。
最后,要根据索引获取具体项目,请遵循上述评论者的建议。如使用
var secondItem = itemDetails[1]
或其他查询,如
using System.Linq;
var queryItem = itemDetails.Where(i=>i.Type.Contains("something")).FirstOrDefault();
所以在你的情况下尝试类似这样的事情:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
var itemDetails = new List<Guitar>(){
new Guitar("Electric", "KA123"),
new Guitar("Manual", "model2"),
new Guitar("Get this one", "main model")
};
// only this one line code needed to get specific item by index
var gList = itemDetails[2];
Console.WriteLine("Type:{0}, Model:{1}", gList.Type, gList.Model);
}
public class Guitar
{
public Guitar(string type, string model) {
Type = type;
Model = model;
}
public string Type {get;set;}
public string Model {get;set;}
}
}
}