映射列表通过Linq表达式
本文关键字:Linq 表达式 列表 映射 | 更新日期: 2023-09-27 18:08:14
我有一个通用的List<Package>
称为packages
。
我为每个项目调用Package
类中的VersionControlGetStatus()
方法。该方法返回一个整数值。
List<EA.Package> list = packages.ForEach(p => p.VersionControlGetStatus());
我想根据该方法的返回值映射列表中的项,以根据返回值创建几个List<Package>
。
我应该如何更新上面的代码?
编辑:例如,我在packages
列表中有3个项目:a
, b
, c
。
当我为每个项目调用该方法时,a
和b
的返回值为1。c
的返回值为8。
期望结果:
两个新的List<Package>
s;第一个包含a
和b
,第二个包含c
我会像Typist建议的那样使用GroupBy()
,但是直接使用分组。它们包含一个包列表和一个Key:
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();
Edit:包含显式类型而不是var,以便更清晰
使用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
}
}
根据以下内容尝试代码:
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
。因此,我们可以遍历groupedPackages以获得一个具有键的packageGroup
,并对其进行我们想要的操作。然后,我们可以像处理任何其他可枚举对象一样,循环遍历该packageGroup
,并执行我们想要的操作。
你也可以做一些事情,比如从原始列表中创建一个查找,让你可以很容易地访问一个特定的状态,比如:
Lookup<int, EA.Package> packageLookup = packages.ToLookup(p=>p.VersionControlGetStatus());
IEnumerable<EA.Package> status0Packages = packageLookup[0];
哪个对你更好取决于你如何使用它们。
注意:所有的代码都是直接写在这个编辑器窗口中,并且是未经测试的,所以可能包含轻微的语法错误或拼写错误。