如何过滤作为C#中另一个列表一部分的子列表

时间:2010-10-08 07:58:47

标签: c#

我想过滤已经属于另一个列表的列表。

考虑,

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

  1. Hareesh Chennai North Street Washington 546466466 ---&gt;子项目1                                 B座纽约464645465 ---&gt;子项目2
  2. 过滤后(条件城= =“纽约”),我应该在主列表中获得输出,如

     Name      MainAddress       ExtraInfo
                                    Address        City        Phone No      
    

    1。 Vimal Bangalore North Street纽约654564646 ---&gt;子项目1

    1. Hareesh Chennai Tower B纽约464645465 ---&gt;子项目1
    2. 希望这有帮助!

2 个答案:

答案 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";
}