我想过滤已经属于另一个列表的列表。
考虑,
Class MainClass
properties
String Name
String MainAddress
List<SubClass> ExtraInfo
Class SubClass
properties
String Address
String City
String PhoneNo
现在我的列表中有10个项目,List中的每个项目都有2个ExtraInfo项目,这是列表项目。
现在我想用条件城市==“纽约”过滤列表项目。
因此,主列表(List)中的所有10个项目都应该具有基于过滤条件的ExtraInfo(List)项目。
我的意思是我只想过滤子列表而不是主列表。
提前致谢!
示例数据 名称MainAddress ExtraInfo 地址城市电话号码 1. Vimal Bangalore North Street纽约654564646 ---&gt;子项目1 North Street California 464654565 ---&gt; Sub item 2
过滤后(条件城= =“纽约”),我应该在主列表中获得输出,如
Name MainAddress ExtraInfo
Address City Phone No
1。 Vimal Bangalore North Street纽约654564646 ---&gt;子项目1
希望这有帮助!
答案 0 :(得分:1)
我可能没有正确理解这个问题,但是:
List<MainClass> mainList = ...
mainList.ForEach(m => m.ExtraInfo.RemoveAll(subClass => subClass.City != "New York"));
这会修改mainList
中的每个项目,方法是从列表成员ExtraInfo
(就地)中删除列表中每个项目(SubClass
类型)的所有项目)没有“纽约”作为其City
。这就是你想要的吗?
如果您只是想要所有与过滤器匹配的“嵌入式”ExtraInfo
项目,无论它们属于哪个MainClass列表,您都可以这样做:
var filteredSubClasses = mainList.SelectMany(m => m.ExtraInfo)
.Where(subClass => subClass.City == "New York");
编辑:基于OP的评论: 这有点难看,但应该是你需要的:
var filteredList = mainList.Select(m => new MainClass
{
Name = m.Name;
MainAddress = m.MainAddress;
ExtraInfo = m.ExtraInfo
.Where(subClass => subClass.City == "New York")
.ToList()
})
.ToList();
IMO,如果MainClass提供了一个复制构造函数或克隆方法,则不再需要逐个复制所有属性。这有点脆 - 如果你向MainClass
添加一个新属性,它将会中断。
答案 1 :(得分:0)
您必须过滤每个子列表:
List<MainClass> mainList = ...
foreach(MainClass main in mainList)
{
ICollectionView view = CollectionViewSource.GetDefaultView(main.ExtraInfo);
view.Filter = ExtraInfoFilter;
}
bool ExtraInfoFilter(object obj)
{
ExtraInfo item = (ExtraInfo)obj;
return item.City == "New York";
}