C# 如何使用Linq过滤c中的嵌套ICollection列表
考虑以下类结构:C# 如何使用Linq过滤c中的嵌套ICollection列表,c#,linq,C#,Linq,考虑以下类结构: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { public class ItemSet { public Guid ID { get; set; } public ICollection<It
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class ItemSet
{
public Guid ID { get; set; }
public ICollection<Item> Items { get; set; }
}
public class Item
{
public Guid ID { get; set; }
public string Type { get; set; }
}
class Program
{
static void Main(string[] args)
{
getItemSet("B2");
}
static public ItemSet generateCompleteItemSet()
{
Item item1 = new Item();
item1.ID = new Guid();
item1.Type = "A1";
Item item2 = new Item();
item2.ID = new Guid();
item2.Type = "B2";
Item item3 = new Item();
item3.ID = new Guid();
item3.Type = "B2";
ICollection<Item> items = new List<Item>();
items.Add(item1);
items.Add(item2);
items.Add(item3);
ItemSet itemSet = new ItemSet();
itemSet.ID = new Guid();
itemSet.Items = items;
return itemSet;
}
static public void getItemSet(string type)
{
ItemSet completeItemSet = generateCompleteItemSet();
ItemSet filteredItemSet = completeItemSet;
filteredItemSet.Items = completeItemSet.Items.Where(item => item.Type == type);
}
}
}
通过以下方式进行测试:
Visual Studio 2017社区版
控制台应用程序.NET框架模板
问题:
如何获取包含“getItemSet”函数中具有指定“Type”属性的所有项的结果项集?
“getItemSet”不会编译,因为where提供IEnumerable,但我需要ICollection。
您可以这样做: 编辑-添加所有项目和筛选项目作为列表
来自什么?请提供一个,理想情况下包括输入数据、预期输出、到目前为止您尝试了什么以及发生了什么。我添加了一个示例。您还没有添加一个,是吗?我可以复制/粘贴/编译/运行那个代码吗?没有。同样地,你还没有展示你已经尝试过的东西或出了什么问题。虽然还没有完成,但情况正在好转-我无法复制/粘贴/编译/运行。。。听起来你所缺少的只是在你的Where呼叫之后给ToList打了个电话。列表实现ICollection。再次编辑问题,即使您已经得到了问题的答案。但我很好奇这是否满足了成为一个好问题的所有要求:。谢谢你的贡献,我同时编辑了这个问题。遗憾的是,这些项目不在列表中,而是在ICollection中。好的,Nvm,.ToList似乎是解决方案。@the_Holy_One好的,这个解决方案对你有用吗?列表实现ICollection接口,所以您不应该有问题。。
//test data
List<Item> itemsList = new List<Item>();
itemsList.Add(new Item() { ID = Guid.NewGuid(), Type = "a" });
itemsList.Add(new Item() { ID = Guid.NewGuid(), Type = "a" });
itemsList.Add(new Item() { ID = Guid.NewGuid(), Type = "b" });
itemsList.Add(new Item() { ID = Guid.NewGuid(), Type = "c" });
List<ItemSet> itemSetList = new List<ItemSet>();
itemSetList.Add(new ItemSet() { ID = Guid.NewGuid(), Items = itemsList });
//select all items
var allItems = itemSetList.SelectMany(i => i.Items).ToList();
//filter items by type
var filteredItems = itemSetList.SelectMany(i => i.Items.Where(x => x.Type == "a")).ToList();