繁体   English   中英

foreach循环的break语句无法使用C#按计划工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM