在C#中显示多个列表

时间:2015-04-30 12:59:22

标签: c# linq entity-framework lambda

我有一个产品列表,随着更多用户添加,该列表将动态增长。我想有这个清单,说:

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 expressions查询我的数据库,但我想不出从哪开始。

5 个答案:

答案 0 :(得分:1)

我会创建一个包含属性的基类,这些属性存在于两个类中(name,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; }
}

按照你每五件商品的广告要求填写。

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]);
    }
}

答案 1 :(得分:0)

逐页选择产品,并将页面中的产品添加到基本列表中。之后,从DB中选择一个广告并将其添加到同一个基本列表中。

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

答案 2 :(得分:0)

这是另一种方法:

  1. 按&#34; AdvertView&#34;对广告列表进行排序降
  2. 显示5个产品后,显示列表中的下一个广告
  3. 如果有超过5 *个advert.Count产品,请在广告列表中重新开始。
  4. 在示例中,我只显示产品名称和广告名称。理想情况下,您会覆盖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);
        }
    }
    

答案 3 :(得分:-1)

在代码中的某处,您肯定有一个函数可以将列表呈现为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
  }
}

答案 4 :(得分:-1)

尝试使用以下内容:

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