按另一个列表 C# 筛选列表

本文关键字:列表 筛选 另一个 | 更新日期: 2023-09-27 18:35:27

我有以下业务对象:

    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)

按另一个列表 C# 筛选列表

如果您有这样的情况:

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

尝试使用一些 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
这是我

在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 类别 = new List() {cat1, cat2};    var itemsInCategory = from item in item    在项目上的类别中联接类别。项目类别等于类别。项目类别到项目类别    从类别中的项在项中项在类别中项    选择"新建 {项目"。标题、项目。项目类别};    itemsInCategory.Dump();}在此处定义其他方法和类      公共类 项目类别BO        {           公共字符串 ItemCategory { get; set; }           公共字符串 Title { get; set; }        }        公共类 ItemBO        {           public int ItemId { get; set; }           公共字符串 Title { get; set; }           公共字符串 ItemCategory { get; set; }        }

这将返回:

标题、项目类别项目1 C1项目2 C2项目3 C2

试试这个:

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

希望这有帮助:

var result = (Object to search in).Where(m => (Object to compare to).Any(r => r.Equals(m.Key)).ToList();