簡體   English   中英

在C#中顯示多個列表

[英]Display multiple lists in C#

我有一個產品列表,並且列表會隨着更多用戶的添加而動態增長。 我想要這個清單,說:

public class Product()
{
   public int ProductId { get; set; } 
   public string ProductName { get; set; } 
   public DateTime ProductDateCreated{ get; set; }
   //....
}

但是,對於每列出的五個項目,我想顯示另一個列表中的另一個項目,所以說我的廣告列表。

public class Advert()
{
   public int AdvertId { get; set; } 
   public string AdvertName { get; set; } 
   public int AdvertView{ get; set; } 
}

var products = db.Products.OrderBy(d=>d.ProductDateCreated).ToList();

--product1
--product2
--product3
--product4
--Advert2   <-- Insert here some how as it has a higher AdvertView than Advert1
--product5
--product6
--product7
--product8
--product9
--Advert1    <-- Insert here some how as it has a lower AdvertView than Advert2

我能形容的最好方式是像Facebook上的廣告,向下滾動時,會不時出現廣告。

我使用lambda表達式查詢數據庫,但我不知道從何處開始。

我將創建一個包含屬性的基類,這兩個類都存在(名稱,id,..?):

public class Product: Items
{      
    public DateTime ProductDateCreated { get; set; }
    //....
}

public class Advert: Items
{

    public int AdvertView { get; set; }
}

public class Items //Advert and Products
{
    public int Id { get; set; }
    public string Name { get; set; }
}

並按要求每5項填入廣告。

List<Advert> adverts = db.Adverts.OrderByDescending(a => a.AdvertView).ToList();
List<Product> products = db.Products.OrderBy(d => d.ProductDateCreated).ToList();
List<Items> ResultList = new List<Items>();
for (int i = 0; i < products.Count; i++)
{
    ResultList.Add(products[i]);
    if ((i + 1) % 5 == 0)
    {
        int advertsIndex = i / 5;
        if (adverts.Count + 1 >= advertsIndex)
            ResultList.Add(adverts[advertsIndex]);
    }
}

逐頁選擇產品,然后將頁面中的產品添加到基本列表中。 之后,從數據庫中選擇一個廣告,並將其添加到相同的基本列表中。

List<object> allItems = new List<object>();
int numOfProdPerPage = 5;
int n = ... // number of products to be listed

var products = db.Products.OrderBy(d=>d.ProductDateCreated);
var adverts = db.Adverts.OrderByDescending(d=>d.AdvertView);

for(int p = 0; p< n / numOfProdPerPage ; p++)
{
    var productsPerPage = products.Skip(numOfProdPerPage * p)
                                  .Take(numOfProdPerPage ).ToList();

    allItems.AddRange(products);

    Advert advert = adverts.ElementAt<Advert>(p);

    allItems.Add(advert);
}

這是另一種方法:

  1. 按“ AdvertView”降序對廣告列表進行排序
  2. 顯示5產品之后,顯示列表中的下一個廣告
  3. 如果廣告數量超過5 *,請在廣告列表中重新開始。

在示例中,我僅顯示產品名稱和廣告名稱。 理想情況下,您將覆蓋ToString()以便它們正確顯示,但是您的問題似乎是關於如何訂購廣告並在每五個產品之后顯示它們。

樣例代碼:

var products = db.Products.OrderBy(d => d.ProductDateCreated).ToList();
var adverts = db.Adverts.OrderByDescending(a => a.AdvertView).ToList();

for (int i = 0; i < products.Count; i++)
{
    Console.WriteLine(products[i].ProductName);

    if ((i + 1) % 5 == 0) 
    {
        Console.WriteLine(adverts[(i / 5) % adverts.Count].AdvertName);
    }
}

您肯定在代碼中的某個位置具有將列表呈現為HTML,插入計數器變量並跟蹤已顯示多少項的功能。 如果遇到第五項,請在此處放置新的廣告。

void RenderToHTML(List<Product> Products)
{
  int AdvertCounter = 0;
  foreach (Product product in Products)
  {
    if (AdvertCounter == 5)
    {
      Advertcounter = 0;
      AddAdvertToList(); //implement somewhere else
    }
    Advertcounter++;
    AddProduct(product); //implement somwhere else too
  }
}

嘗試使用如下形式:

 List<Product> list1;
 List<Advert> list2 ;

 //Full list1 && list 2
 int counterForList2 = 0;
 foreach (string value in list1)
 {
     Console.WriteLine(value);
     if (list1.Count() % 5 == 0)
     {
         if (counterForList2 == list2.Count)
             counterForList2 = 0;
         Console.WriteLine(list2[counterForList2]);
         counterForList2++;
     }
 }

您的問題采用了設計解決方案,我認為這不是最佳方案。 與其顯示不同列表中的項目,不如創建以下界面:

interface IEntry
{
    string Name { get; set; }
    int Id { get; set; }
}   

然后在產品和廣告中繼承它,添加特定功能:

class Product : IEntry   
{
    string Name { get; set; }
    int Id { get; set; }
    DateTime DateCreated { get; set; }
}    

之后,只需使類繼承自

List<IEntry>    

確保advert類以您想要的方式顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM