我有一个名为List<Package>
的通用packages
。
我从VersionControlGetStatus()
类调用方法Package
的每个项目。该方法返回一个整数值。
List<EA.Package> list = packages.ForEach(p => p.VersionControlGetStatus());
我想根据方法返回的值映射列表中的项目,根据返回的值创建多个List<Package>
。
我应该如何更新上面的代码?
修改
例如,我在packages
列表中有3个项目:a
,b
,c
。
当我为每个项目调用方法时,a
和b
的返回值为1.
c
的返回值为8.
期望的结果:
两个新List<Package>
个;第一个包含a
和b
,第二个包含c
。
答案 0 :(得分:2)
使用Linq GroupBy
子句
var listOfPackages = packages.GroupBy(p => p.VersionControlGetStatus())
.Select(g => g.ToList());
listOfPackages
是IEnumerable<List<package>>
根据您的示例,这将为您提供2个列表。您可以从2个返回的列表中访问该软件包,如下所示 -
foreach(var packageList in listOfPackages) {
foreach(var pack in packageList ) {
// work with your pacakge
}
}
答案 1 :(得分:2)
我会使用GroupBy()
作为打字员建议,但直接使用分组。它们包含一个包列表和一个密钥:
IEnumerable<IGrouping<int,Package>> groups = packages.GroupBy(p => p.VersionControlGetStatus()).OrderBy(g => g.Key);
foreach(IGrouping<int,Package> g in groups)
{
Console.WriteLine("Key: {0} | Count: {1}", g.Key, g.Count());
Package first = g.First();
Console.WriteLine("First package in group: " + first.ToString());
}
如果您想要具有特定状态的套餐:
List<Package> value1Packages = groups.Single(g => g.Key == 1).ToList();
修改:为了清晰起见,包含显式类型而不是var
答案 2 :(得分:1)
根据以下内容尝试代码:
IEnumerable<IGrouping<int, EA.Package>> groupedPackages = packages.GroupBy(p => p.VersionControlGetStatus());
foreach (IGrouping<int, EA.Package> packageGroup in groupedPackages)
{
Console.WriteLine("Status: " + packageGroup.Key.ToString());
Console.WriteLine("Packages:");
foreach (EA.Package package in packageGroup)
{
Console.WriteLine(package.ToString());
}
Console.WriteLine();
}
第一行创建IEnumerable<IGrouping<>>
。 IGrouping
基本上是IEnumerable
,其中包含用于对其进行分组的密钥。因此,我们可以遍历我们的groupsPackages以获得具有密钥的packageGroup
并按照我们想要的那样做。然后,我们可以像其他任何可枚举的那样循环遍历packageGroup
并执行我们想要的操作。
您还可以执行以下操作:例如,从原始列表创建查找,以便您可以使用以下内容轻松访问特定状态:
Lookup<int, EA.Package> packageLookup = packages.ToLookup(p=>p.VersionControlGetStatus());
IEnumerable<EA.Package> status0Packages = packageLookup[0];
哪种更适合您取决于您将如何使用它们。
注意:所有代码都已直接写入此编辑器窗口,未经测试,因此可能包含较小的语法错误或拼写错误。