[英]Filter a list by another list 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);
如果我有几个类别的列表,如何在类别列表中找到包含类别的项目列表? (在我的示例中,我想取回第 2 项和第 3 项)
如果你有这样的情况:
List<ItemBO> items;
List<ItemCategoryBO> categories;
并且您希望获得类别列表中具有类别的所有项目,您可以使用以下命令:
IEnumerable<ItemBO> result = items.Where(item =>
categories.Any(category => category.ItemCategory.equals(item.ItemCategory)));
Any 运算符枚举源序列,如果任何元素满足谓词给出的测试,则返回 true。 在这种情况下,如果类别列表包含 ItemCategoryBO,其中其 ItemCategory 字符串与项目的 ItemCategory 字符串相同,则它返回 true。 MSDN上有关它的更多信息
尝试这个:
List<ItemBO> items = ...;
ItemCategoryBO category = ...;
List<ItemBO> filteredItems = items
.Where( i => i.ItemCategory.Equals(category) )
.FirstOrDefault();
更新以解决 OP 的更新问题:
如果我有几个类别的列表,如何在类别列表中找到包含类别的项目列表? (在我的示例中,我想取回第 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();
尝试使用一些 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
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
希望这可以帮助:
var result = (Object to search in).Where(m => (Object to compare to).Any(r => r.Equals(m.Key)).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.