2012-09-17 21 views
2

在我的asp mvc 3應用程序中,我想顯示一張照片專輯。所以會有選定的圖片和相冊中其他圖片的縮略圖列表。用戶將能夠看到的縮略圖列表僅包含8張照片,其他所有照片都將被隱藏。我想要的是從選定的項目開始這個列表,當列表到達最後而沒有完成所有項目時,它將從頭開始重新開始。如何用C#列表製作一個循環#

我設法做到這一點,但我覺得它很快,很髒。是否有任何內置的C#函數可以用來做到這一點?

@{int i = 0;} 
@foreach (AlbumPhoto albmphoto in Model.AlbumPhotoList 
    .Where(p => p.AlbumPhotoId > int.Parse(SinglePhoto)) 
    .OrderBy(p => p.AlbumPhotoId)) 
{ 
    i++; 
    string show = "none"; 
    if (i < 8) 
    { 
     show = "block"; 
    } 
    <a href="#" style="display: @show"> 
     <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" /> 
    </a>     
} 

@foreach (AlbumPhoto albmphoto in Model.AlbumPhotoList 
    .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto)) 
    .OrderBy(p => p.AlbumPhotoId)) 
{ 
    i++; 
    string show = "none"; 
    if (i < 8) 
    { 
     show = "block"; 
    } 
    <a href="#" style="display: @show"> 
     <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" /> 
    </a>     
} 

回答

0

我不認爲有建於做一個「利添利foreach」在一個IEnumerable什麼,但你可以用的毗連略少令人作嘔解決這個問題,本質上又追加了一組對象本身。

var photos = Model.AlbumPhotoList 
    .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto)) 
    .OrderBy(p => p.AlbumPhotoId); 

@foreach(var albumphoto in photos.Concat(photos)) 
{ 
    i++; 
     string show = "none"; 
     if (i < 8) 
     { 
      show = "block"; 
     } 
     <a href="#" style="display: @show"> 
      <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" /> 
     </a>  
} 

然後,如果它走到最後,它會轉入下一組。

另外,爲更好的解決方案,你可以ToList的IEnumerable和使用%做更好的索引:

var photos = Model.AlbumPhotoList 
     .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto)) 
     .OrderBy(p => p.AlbumPhotoId) 
     .ToList(); 

@for(int i = 0; i < 8; ++i) 
{ 
if(i < 8) 
{ 
    show = "block"; 
} 
var albumphoto = photos[i % photos.Count]; 
<a href="#" style="display: @show"> 
    <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" /> 
</a> 
} 
+0

感謝您的答覆,我做了像你的第一個代碼,但使用了一個工會,而不是。我將列表分成2個列表:第一個列表包含位於起始索引之後的元素,另一個列表包含其餘元素。然後在foreach循環中使用:foreach(var albumphoto in photosAfter.Union(photosBefore)) – kbaccouche

0

而不是改變display值,你可以只退出循環,一旦你已經有了8項(break;)。

我還沒有使用asp.net/Linq(試圖進入它),但我會嘗試做這樣的事情(因此認爲它是僞代碼;如果這是完整的,我願意接受反饋BS或任何!):

@{ 
    var index = int.Parse(SinglePhoto); // starting index 
    var list = Model.AlbumPhotoList.OrderBy(...); // get all images 
    // Now duplicate the first 8 elements of the list, then skip the images not visible 
    // and then limit the number of visible items to 8 
    list = list.Union(list.Top(8)).Skip(index).Top(8).ToList(); 
} 
@foreach(AlbumPhoto photo in list){ 
    // html output 
} 
+0

感謝您的回覆,實際上我希望圖片在我的視圖中並被隱藏。 – kbaccouche

+0

啊,好的。這實質上是生成JavaScript來切換它,還是會使用「靜態」HTML?後一種情況下,這似乎是你在HTML中不需要的額外開銷。 – Mario

+0

是的,它會生成JavaScript來切換它 – kbaccouche