Linq Expression的地图列表

时间:2014-06-12 11:25:00

标签: c# linq list return-value

我有一个名为List<Package>的通用packages

我从VersionControlGetStatus()类调用方法Package的每个项目。该方法返回一个整数值。

 List<EA.Package> list = packages.ForEach(p => p.VersionControlGetStatus());    

我想根据方法返回的值映射列表中的项目,根据返回的值创建多个List<Package>

我应该如何更新上面的代码?

修改

例如,我在packages列表中有3个项目:abc

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

期望的结果:

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

3 个答案:

答案 0 :(得分:2)

使用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
    }        
}

答案 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];

哪种更适合您取决于您​​将如何使用它们。

注意:所有代码都已直接写入此编辑器窗口,未经测试,因此可能包含较小的语法错误或拼写错误。