Отфильтровать список другим списком С#
У меня есть следующие бизнес-объекты:
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);
Если у меня есть список нескольких категорий, как я могу найти список элементов, которые содержат категорию в списке категорий? (В моем примере я хочу вернуть элементы 2 и 3)
Ответы
Ответ 1
Если у вас есть ситуация, как:
List<ItemBO> items;
List<ItemCategoryBO> categories;
и вы хотите получить все элементы, которые имеют категорию, которая находится в вашем списке категорий, вы можете использовать это:
IEnumerable<ItemBO> result = items.Where(item =>
categories.Any(category => category.ItemCategory.equals(item.ItemCategory)));
Оператор Any перечисляет исходную последовательность и возвращает true, если какой-либо элемент удовлетворяет критерию, данному предикатом. В этом случае он возвращает true, если список категорий содержит ItemCategoryBO, где его строка ItemCategory совпадает со строкой ItemCategory элемента. Больше информации об этом на MSDN
Ответ 2
Попробуй это:
List<ItemBO> items = ...;
ItemCategoryBO category = ...;
List<ItemBO> filteredItems = items
.Where( i => i.ItemCategory.Equals(category) )
.FirstOrDefault();
Обновлен для решения обновленного вопроса:
Если у меня есть список нескольких категорий, как я могу найти список элементов, которые содержат категорию в списке категорий? (В моем примере я хочу вернуть элементы 2 и 3)
Я думаю, вы должны сделать это в два шага. Во-первых, получите свой отдельный список предметов. Затем, из ваших предметов, получите список категорий. Так:
// 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();
Ответ 3
Попробуйте использовать некоторые 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
Ответ 4
Вот что я сделал в 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; }
}
Это возвращает:
Title, ItemCategory
item1 c1
item2 c2
item3 c2
Ответ 5
Надеюсь это поможет:
var result = (Object to search in).Where(m => (Object to compare to).Any(r => r.Equals(m.Key)).ToList();