映射列表通过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

当我为每个项目调用该方法时,ab的返回值为1。
c的返回值为8。

期望结果:

两个新的List<Package> s;第一个包含ab,第二个包含c

映射列表通过Linq表达式

我会像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());

listOfPackagesIEnumerable<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];

哪个对你更好取决于你如何使用它们。

注意:所有的代码都是直接写在这个编辑器窗口中,并且是未经测试的,所以可能包含轻微的语法错误或拼写错误。