2012-05-24 26 views
13

Ben şu iş nesneler:başka liste C# ile bir listesini filtreleme

public class ItemCategoryBO 
    { 
     public string ItemCategory { get; set; } 
     public string Title { get; set; } 
    } 

    public class ItemBO 
    { 
     public int ItemId { get; set; } 
     public string Title { get; set; } 
     public string ItemCategory { get; set; } 
    } 

    List<ItemCategoryBO> categoryList = new List<ItemCategoryBO>(); 

    ItemCategoryBO itemCategory = new ItemCategoryBO(); 
    itemCategory.ItemCategoryCd = "CARS"; 
    itemCategory.Title = "Cars"; 

    ItemCategoryBO itemCategory2 = new ItemCategoryBO(); 
    itemCategory.ItemCategoryCd = "PLANES"; 
    itemCategory.Title = "Planes"; 

    categoryList.Add(itemCategory); 
    categoryList.Add(itemCategory2); 

    List<ItemBO> itemList = new List<ItemBO>(); 

    ItemBO item1 = new ItemBO(); 
    item1.ItemId = 1; 
    item1.Title = "1st item"; 
    item1.ItemCategoryCd = "OTHER"; 

    ItemBO item2 = new ItemBO(); 
    item2.ItemId = 2; 
    item2.Title = "2nd Item"; 
    item2.ItemCategoryCd = "CARS"; 

    ItemBO item3 = new ItemBO(); 
    item3.ItemId = 3; 
    item3.Title = "3rd Item"; 
    item3.ItemCategoryCd = "PLANES"; 

    itemList.Add(item1); 
    itemList.Add(item2); 
    itemList.Add(item3); 

Birkaç kategori listesi varsa, nasıl listesinde bir kategoriyi içeren öğeleri listesini bulabiliriz kategoriler? (Benim örnekte, ürün 2 geri almak istiyor ve 3)

+0

Listeleriniz nelerdir? Ve emin olmak için, 'filtrelemek' burada ne anlama geliyor? –

+1

Gerçekten buradaki oyları anlamıyorum. OP'nin ne istediğini anlamak çok zor değil. Ve eğer gerçekten bir şey aşağı bir oylama emrini vermek için yeterince kötü ise, OP'den ayrılmanızın neden onları reddettiğinizi açıklamak için bazı geri bildirimler bırakın. –

+0

@CharlieKilian gerçekten anlamıyor mu? Yorum yaptıktan sonra 'OP'nin ne için sorduğunu anlamak çok zor değil? –

cevap

48

varsa böyle bir durum: Eğer istediğiniz

List<ItemBO> items; 
List<ItemCategoryBO> categories; 

ve kategori olan tüm öğeleri al Bu kategorileri listenizde bulunan, bu kullanabilirsiniz:

List<ItemBO> result = items.Where(item => 
    categories.Any(category => category.ItemCategory.equals(item.ItemCategory))); 

Herhangi operatör kaynak dizisini sıralar ve herhangi eleman yüklemi tarafından verilen testi tatmin true döndürür. Bu durumda, kategoriler listesi ItemCategory dizesinin öğenin ItemCategory dizesiyle aynı olduğu ItemCategoryBO içeriyorsa, doğru döner. Buna ilgili daha fazla bilgi MSDN

+0

Teşekkür ederim Diana, hala linq için biraz yeni. Tam olarak aradığım şey! – stillsmallvoice

+0

Bunu açıklamanın basit yolu, Teşekkürler !!!! :) – Yaz

+0

Benim için de çalıştı –

1

List<ItemBO> itm = new List<ItemBO>; 
//Fill itm with data 

//get selected item from control 

string selectedcategory = cboCatetories.SelectedItem; 

var itms = from BO in itm where itm.ItemCategory = selectedcategory        select itm; 

itms now contains all items in that category 
+0

Teşekkürler Micah, Sorumu güncelledim, sadece bir öğenin kategorisine göre dinamik olarak filtrelemenin bir yolunu arıyorum, sadece bir öğenin kategorisi değil – stillsmallvoice

2

bu deneyin bazı linq kullanmayı deneyin: OP'ın güncellenen soru adres Güncelleme

List<ItemBO> items = ...; 
ItemCategoryBO category = ...; 

List<ItemBO> filteredItems = items 
    .Where(i => i.ItemCategory.Equals(category)) 
    .FirstOrDefault(); 

:

Birkaç kategoriden oluşan bir listem varsa, kategori listesinde bir kategori içeren öğelerin listesini nasıl bulabilirim? (Örneğimde, 2 ve 3 numaralı öğeleri geri almak istiyorum)

Bunu iki adımda yapmanız gerektiğini düşünüyorum. Öncelikle, farklı ürün listelerinizi alın. Daha sonra, öğelerinizden, kategori listenizi alın. Yani:

İşte
// First, get the distinct list of items 
List<ItemBO> items = new List<ItemBO>(); 
foreach (var category in categories) 
{ 
    foreach (var item in category.Items) 
    { 
     if (!items.Contains(item)) 
      items.Add(item); 
    } 
} 

// Second, get the list of items that have the category. 
List<ItemBO> filteredItems = items 
    .Where(i => i.ItemCategory.Equals(category)) 
    .FirstOrDefault(); 
+0

Kategorilerin bir listesi için bunu nasıl yapabilirim? – stillsmallvoice

+0

Reddetme mi? Güzel L.B. –

+0

@CharlieKilian, benim cevabımı iptal edecek ASAP, cevabın ne cevap verdiğini anladım –

1

Ben Linqpad

 
void Main() 
{ 

    var cat1 = new ItemCategoryBO {ItemCategory="c1", Title = "c1"}; 
    var cat2 = new ItemCategoryBO {ItemCategory="c2", Title = "c2"}; 

    var item1 = new ItemBO { ItemId = 1, Title = "item1", ItemCategory="c1"}; 
    var item2 = new ItemBO { ItemId = 1, Title = "item2", ItemCategory="c2"}; 
    var item3 = new ItemBO { ItemId = 1, Title = "item3", ItemCategory="c2"}; 
    var item4 = new ItemBO { ItemId = 1, Title = "item4", ItemCategory="c3"}; 

    var items = new List() {item1, item2, item3, item4}; 
    var categories = new List() {cat1, cat2}; 

    var itemsInCategory = from item in items 
    join category in categories on item.ItemCategory equals category.ItemCategory into itemInCategory 
    from categoryItem in itemInCategory 
    select new {item.Title, item.ItemCategory}; 

    itemsInCategory.Dump(); 
} 

// Define other methods and classes here 
     public class ItemCategoryBO 
     { 
      public string ItemCategory { get; set; } 
      public string Title { get; set; } 
     } 

     public class ItemBO 
     { 
      public int ItemId { get; set; } 
      public string Title { get; set; } 
      public string ItemCategory { get; set; } 
     } 

Bu döndürür yaptığı şey:

 
Title, ItemCategory 
item1 c1 
item2 c2 
item3 c2 
İlgili konular