2

asp mvc 3 アプリケーションで、写真のアルバムを表示したいと考えています。そのため、選択した写真と、アルバム内の他の写真のサムネイルのリストが表示されます。ユーザーが表示できるサムネイルのリストには 8 枚の画像のみが含まれ、その他はすべて非表示になります。私が望むのは、このリストを選択した項目から開始し、すべての項目を終了せずにリストが最後に到達すると、最初から再開することです。

このコードで何とかできましたが、すばやく汚いことがわかりました。それを行うために使用できる組み込みの 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>                   
}
4

2 に答える 2

0

の値を変更する代わりに、display8 つのエントリを取得したらループを終了できます ( 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
}
于 2012-09-17T19:01:28.730 に答える
0

foreachに「ロールオーバー」を行うために組み込まれたものは何もないと思いますがIEnumerable、Concat を使用すると、基本的にオブジェクトのセットをそれ自体に再度追加することで、少し不快に解決できます。

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>       
}

そして、最後から外れると、次のセットにロールオーバーします。

または、より良い解決策として、IEnumerable を ToList し、 a%を使用してインデックス作成を改善することもできます。

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> 
}
于 2012-09-17T18:50:51.510 に答える