2016-11-22 52 views
0

我一直想知道如何打破一個foreach循環,我可以得到輸出而不通過存儲在其中的整個元素。我的問題是,每當我使用break語句停止獲取第二個元素時,第一個元素也顯示出來。就像你只想得到第二個元素一樣,作爲回報,它會顯示第一個元素和第二個元素。我只想要第二個元素出現。foreach循環的break語句不按照計劃使用c#工作?

爲了更好地解釋這一點,這裏是我的代碼:

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語句將它從第三個循環中分解出來,這樣它可以顯示第二個元素,但是它會顯示第一個元素和第二個元素。希望你們可以幫助我只顯示第二個元素。隨意編輯並提出更好的代碼技術。

+1

如果你只想要第二個元素 - 那麼爲什麼環在所有? –

+2

循環基本上是爲所有事情做些事情。休息會停止循環,但循環所做的一切都已完成。使用索引器訪問列表,比如'itemDetails [1]''。 – Sascha

+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(在打破它之前)。爲了解決這個問題,我們可以在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;} 
     } 
    } 
} 
+0

我試過這個,它根本不顯示任何東西。 – BrunoEarth

+0

好吧,最後它的工作。你也介意以正確的方式做一個例子嗎? – BrunoEarth

+0

我上面添加了示例,請查看它 – RizkiDPrast