[英]break statement for foreach loop not working as planned using c#?
我一直想知道如何打破一个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个元素。 希望你们能帮助我仅显示第二个元素。 随时编辑并提出更好的代码技术。
您可以尝试这样的操作(尽管不是正确的方法)。 如果不是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
(在中断循环之前)。 为了解决这个问题,我们可以在您的sb.Append
代码之前使用continue
跳过当前迭代(这很有用,但在这种情况下不可用)。 最后,要获取基于索引的特定项目,请遵循以上评论者的建议。 如用
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;}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.