繁体   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