使用 LINQ 根据列表中存在的匹配 ID 过滤数据
Filtering data based on matching ids present in a list using LINQ
我编写了一个程序,可以根据来自另一个列表的 ID 列表过滤数据列表。执行 LINQ 查询后,我只想返回那些仅与过滤条件中存在的数据相匹配的数据。
我的程序是这样的
public class MarketplacePackageInfo
{
public string PackageId { get; set; }
public string PackageName { get; set; }
public List<AppInfo> Apps { get; set; }
}
public class AppInfo
{
public string AppName { get; set; }
public string AppId { get; set; }
}
List<string>appIds=new List<string>();
appIds.Add("a1");
appIds.Add("a2");
List<MarketplacePackageInfo> packageList = new List<MarketplacePackageInfo>();
MarketplacePackageInfo pacakage1 = new MarketplacePackageInfo();
pacakage1.PackageId = "P1";
pacakage1.PackageId = "Package1";
pacakage1.Apps=new List<AppInfo>();
pacakage1.Apps.Add(new AppInfo { AppId = "a1",AppName="app1" });
pacakage1.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage1.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage1);
MarketplacePackageInfo pacakage2 = new MarketplacePackageInfo();
pacakage2.PackageId = "P2";
pacakage2.PackageId = "Package2";
pacakage2.Apps = new List<AppInfo>();
pacakage2.Apps.Add(new AppInfo { AppId = "a1", AppName = "app1" });
pacakage2.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
packageList.Add(pacakage2);
MarketplacePackageInfo pacakage3 = new MarketplacePackageInfo();
pacakage3.PackageId = "P3";
pacakage3.PackageId = "Package3";
pacakage3.Apps = new List<AppInfo>();
pacakage3.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage3.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage3);
MarketplacePackageInfo pacakage4 = new MarketplacePackageInfo();
pacakage4.PackageId = "P4";
pacakage4.PackageId = "Package4";
pacakage4.Apps = new List<AppInfo>();
pacakage4.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage4.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
pacakage4.Apps.Add(new AppInfo { AppId = "a4", AppName = "app4" });
packageList.Add(pacakage4);
var filterList= packageList.Where(e => e.Apps.Where(a => !appIds.Contains(a.AppId)).Count() > 0).ToList();
我想要的输出是我将只获得 package2,因为这两个应用程序都存在并且没有额外的应用程序。但它正在返回不应该出现的 Package1、package 和 package4 的数据。如何编写该查询?
您可以尝试以下给出相同结果的语句:
var filterList = packageList.Where(e => e.Apps.Count(apps => !appIds.Contains(apps.AppId)) == 0).ToList();
或者使用 All
我认为在可读性方面更好
var filterList = packageList.Where(e => e.Apps.All(apps => appIds.Contains(apps.AppId))).ToList();
他们都为您提供的软件包(在本例中为 package2
)仅包含 appIds
中的应用程序,没有其他应用程序。
我编写了一个程序,可以根据来自另一个列表的 ID 列表过滤数据列表。执行 LINQ 查询后,我只想返回那些仅与过滤条件中存在的数据相匹配的数据。
我的程序是这样的
public class MarketplacePackageInfo
{
public string PackageId { get; set; }
public string PackageName { get; set; }
public List<AppInfo> Apps { get; set; }
}
public class AppInfo
{
public string AppName { get; set; }
public string AppId { get; set; }
}
List<string>appIds=new List<string>();
appIds.Add("a1");
appIds.Add("a2");
List<MarketplacePackageInfo> packageList = new List<MarketplacePackageInfo>();
MarketplacePackageInfo pacakage1 = new MarketplacePackageInfo();
pacakage1.PackageId = "P1";
pacakage1.PackageId = "Package1";
pacakage1.Apps=new List<AppInfo>();
pacakage1.Apps.Add(new AppInfo { AppId = "a1",AppName="app1" });
pacakage1.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage1.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage1);
MarketplacePackageInfo pacakage2 = new MarketplacePackageInfo();
pacakage2.PackageId = "P2";
pacakage2.PackageId = "Package2";
pacakage2.Apps = new List<AppInfo>();
pacakage2.Apps.Add(new AppInfo { AppId = "a1", AppName = "app1" });
pacakage2.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
packageList.Add(pacakage2);
MarketplacePackageInfo pacakage3 = new MarketplacePackageInfo();
pacakage3.PackageId = "P3";
pacakage3.PackageId = "Package3";
pacakage3.Apps = new List<AppInfo>();
pacakage3.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage3.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage3);
MarketplacePackageInfo pacakage4 = new MarketplacePackageInfo();
pacakage4.PackageId = "P4";
pacakage4.PackageId = "Package4";
pacakage4.Apps = new List<AppInfo>();
pacakage4.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage4.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
pacakage4.Apps.Add(new AppInfo { AppId = "a4", AppName = "app4" });
packageList.Add(pacakage4);
var filterList= packageList.Where(e => e.Apps.Where(a => !appIds.Contains(a.AppId)).Count() > 0).ToList();
我想要的输出是我将只获得 package2,因为这两个应用程序都存在并且没有额外的应用程序。但它正在返回不应该出现的 Package1、package 和 package4 的数据。如何编写该查询?
您可以尝试以下给出相同结果的语句:
var filterList = packageList.Where(e => e.Apps.Count(apps => !appIds.Contains(apps.AppId)) == 0).ToList();
或者使用 All
我认为在可读性方面更好
var filterList = packageList.Where(e => e.Apps.All(apps => appIds.Contains(apps.AppId))).ToList();
他们都为您提供的软件包(在本例中为 package2
)仅包含 appIds
中的应用程序,没有其他应用程序。