2012-05-24 109 views
13

tengo los siguientes objetos de negocio:Filtrar una lista por otra lista de C#

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

Si tengo una lista de algunas categorías, ¿cómo podría encontrar una lista de elementos que contienen una categoría en la lista de categorías? (En mi ejemplo, yo quiero volver artículos 2 y 3)

+0

¿Cuáles son sus listas? Y para estar seguro, ¿qué significa 'filtrar por' aquí? –

+1

Realmente no entiendo los votos abajo aquí. No es muy difícil averiguar lo que el OP está pidiendo. Y si realmente cree que es lo suficientemente malo como para justificar un voto a la baja, deje algunos comentarios al OP para explicar por qué los votó. –

+0

@CharlieKilian realmente no entiendo? después de comentar '¿No es muy difícil averiguar qué está pidiendo el OP'? –

Respuesta

48

Si usted tiene una situación como:

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

y desea obtener todos los artículos que tienen una categoría es decir en su lista de categorías, puede utilizar esto:

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

El Cualquier operador enumera la secuencia de origen y devuelve cierto si cualquier elemento satisface la prueba propuesta por el predicado. En este caso, devuelve verdadero si la lista de categorías contiene un ItemCategoryBO donde su cadena ItemCategory es la misma que la cadena ItemCategory del artículo. Más información al respecto en MSDN

+0

Muchas gracias Diana, todavía un poco nueva en linq. ¡Exactamente lo que estaba buscando! – stillsmallvoice

+0

La manera simple de explicarlo, ¡Gracias! :) – Yaz

+0

Funcionó para mí también –

1

trate de usar algunas LINQ

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

Gracias Micah, actualicé mi pregunta, estoy buscando una manera de filtrar dinámicamente en base a otra lista, no solo la categoría de un elemento – stillsmallvoice

2

Prueba esto:

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

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

actualizado para solucionar cuestión actualizada de OP:

Si tengo una lista de algunas categorías, ¿cómo podría encontrar una lista de artículos que contienen una categoría en la lista de categorías? (En mi ejemplo, quiero recuperar los artículos 2 y 3)

Creo que en realidad deberías hacer esto en dos pasos. Primero, obtenga su lista distinta de artículos. Luego, de sus artículos, obtenga su lista de categorías. Por lo tanto:

// 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

¿Cómo puedo hacer esto para obtener una lista de categorías? – stillsmallvoice

+0

¿Un voto a favor? Nice, L.B. –

+0

@CharlieKilian cancelaré mi voto a la baja ASAP entiendo cuál es tu respuesta –

1

Aquí hay algo que hice en 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; } 
     } 

Esto devuelve:

 
Title, ItemCategory 
item1 c1 
item2 c2 
item3 c2 
Cuestiones relacionadas