2015-04-30 8 views
0

У меня есть список продуктов, и список будет динамически расти по мере увеличения количества пользователей. Я хотел бы иметь этот список, скажу:Отображение нескольких списков в C#

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

Но для каждого, скажем, пяти пунктов в списке, я хочу, чтобы отобразить другой элемент из другого списка, так сказать, мой список Advert.

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, запрашивая мою базу данных, но я не могу думать, с чего начать.

+0

Когда и будет решать, чтобы отобразить элементы из первого списка? это будет сделано периодически? – Coder1409

+2

Боковой комментарий: при определении класса вы не используете скобки рядом с именем класса. –

+0

Вы можете добавить в «Список », а затем разобрать на выходе. Думаю, что – Wizard

ответ

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

Это не показывает, как показывать рекламу, начиная с самого верхнего объявления. –

1

Я хотел бы создать базовый класс, который содержит свойства, которые существуют в обоих классах (имя, идентификатор, ..?):

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

И заполнить его, как вы просили с Advert каждый пятый пункт ,

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

Попробуйте использовать что-то вроде этого:

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

Это не показывает, как показывать рекламу с помощью рекламного объявления, хотя –

0

Выберите страницу продуктов на странице и добавить продукты на странице с базовым списком. После этого выберите объявление из БД и добавьте его в тот же базовый список.

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

Это не показывает, как показывать рекламу с помощью AdsView, хотя –

+0

Просто для упрощения решение, я не добавил, как выбрать желаемое объявление. Теперь, я думаю, это будет самый высокий. – mhmtztmr

-1

Ваш вопрос предполагает дизайнерское решение, которое, на мой взгляд, не оптимально. Вместо того, чтобы отображать элемент из другого списка, почему бы не создать следующий интерфейс:

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>  

, чтобы убедиться, что класс объявлений выглядит так, как вы хотите.

+0

Это не показывает, как отображать рекламные объявления в AdWords, хотя –

0

Вот другой подход:

  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); 
    } 
} 
Смежные вопросы