繁体   English   中英

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

[英]How to filter a sub list which is part of another list in C#

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

考虑,

类MainClass

  properties

      String Name

      String MainAddress

      List<SubClass> ExtraInfo

类子类

  properties

      String Address

      String City

      String PhoneNo

现在我列表中有10个项目,列表中的每个项目都有2个ExtraInfo项目,这就是列表项目。

现在我想用条件城市==“纽约”来过滤列表项目。

因此,基于过滤条件,主列表(列表)中的所有10个项目都应具有ExtraInfo(列表)项目。

我的意思是我只想过滤子列表而不是主列表。

提前致谢!

样本数据名称MainAddress ExtraInfo地址城市电话号码
1. Vimal班加罗尔纽约北街654564646 --->子项目1加利福尼亚州北街464654565 --->子项目2

  1. 哈雷什·钦奈北街华盛顿546466466 --->子项目1纽约B座464645465 --->子项目2

过滤后(条件城市==“纽约”),我应该在主列表中得到输出

 Name      MainAddress       ExtraInfo
                                Address        City        Phone No      

1. Vimal班加罗尔纽约北街654564646 --->子项目1

  1. 哈雷什·钦奈B座纽约464645465 --->子项目1

希望这可以帮助!

我可能未正确理解问题,但是:

List<MainClass> mainList = ...
mainList.ForEach(m => m.ExtraInfo.RemoveAll(subClass => subClass.City != "New York"));

通过从列表成员ExtraInfo删除所有项目(就位),列表中的每个项目(类型为SubClass )都没有“ New York”作为其City ,这将修改mainList中的每个项目。 那是你要的吗?

如果您只是希望所有与过滤器匹配的“嵌入式” 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提供了一个复制构造函数或克隆方法会更容易,而不需要一一复制所有属性。 这有点脆弱-如果将新属性添加到MainClassMainClass

您必须过滤每个子列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM