foreach循环的break语句不能按计划使用c#工作?

时间:2016-11-22 04:57:20

标签: c# asp.net loops foreach break

我一直想知道如何打破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个元素。希望你们能帮助我展示第二个元素。随意编辑并建议更好的代码技术。

1 个答案:

答案 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;}
        }
    }
}