繁体   English   中英

C# Linq 查询加入两个列表并将结果分配给新列表

[英]C# Linq query to join two lists and assign the result to new list

先拨model:

public class Group
{
    public string Name { get; set; } 
    public string Sid { get; set; }
}

第二个model:

public class GuidelinesWorkTeam
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Sid { get; set; }
    public bool Active { get; set; }
}

我有这个方法:

public IEnumerable<GuidelinesWorkTeam> GetWorkTeamsWhereChangeName(
       IEnumerable<Group> adGroups,
       IEnumerable<GuidelinesWorkTeam> gwtItems)
    {
        return gwtItems.Where(gwtItem => adGroups.Any(adGroup => gwtItem.Sid == adGroup.Sid && gwtItem.Name != adGroup.Name));
    }

广告组输入

Object 名称 席德
[0] 工作组1 SID1
[1] WorkTeam3 SID2

gwtItems 输入

Object ID 名称 席德 积极的
[0] 1个 工作组1 SID1 真的
[1] 2个 工作组2 SID2 真的

期望的结果

Object ID 名称 席德 积极的
[0] 2个 WorkTeam3 SID2 真的

演示在这里

如果满足上述条件,我需要返回一个IEnumerable<GuidelinesWorkTeam> (或其他 IEnumerable,因为我只需要adGroup.NamegwtItem.Id )元素,但用adGroup.Name替换gwtItem.Name

我怎样才能做到这一点?

根据我对您问题的理解,我想提出两种不同的解决方法:

  • 在将adGroups项目与adGroups项目相关联之前过滤gwtItems中的项目
  • (像您已经完成的那样过滤gwtItems中的项目,然后)将gwtItems项目与adGroups项目相关联

根据哪个变量( adGroupsgwtItems )从最初过滤中获益最多,您可以选择最适合您的用例的方法。

过滤adGroups项目,然后将它们与gwtItems项目相关联

在这里,在每个基于Sid的分组根据 gwtItem 的Sid值与来自gwtItems的项目相关联之前, adGroups中的所有适用项目都按Sid分组。 在使用.Join()adGroups分组和gwtItems与相等的Sid (和不相等的Name ,由于adGroups的初始过滤)相关联之后,我们 select 每个关联的 adGroup 和 gwtItem 对的adGroup.NamegwtItem.Id在一个tuple中并使用SelectMany()展平集合(从IEnumerable<IEnumerable< * >>IEnumerable< * > )。

public IEnumerable<( string Name, int Id )> GetWorkTeamsWhereChangeName(
    IEnumerable<Group> adGroups,
    IEnumerable<GuidelinesWorkTeam> gwtItems)
{
    return adGroups
        .Where(adGroup => gwtItems.Any(gwtItem => 
            gwtItem.Sid == adGroup.Sid &&
            gwtItem.Name != adGroup.Name))
        .GroupBy(adGroup => adGroup.Sid)
        .Join(gwtItems,
            grouping => grouping.Key,
            gwtItem => gwtItem.Sid,
            ( grouping, gwtItem ) => grouping
                .Select(adGroup => ( adGroup.Name, gwtItem.Id )))
        .SelectMany(_ => _);
}

gwtItems项目与adGroups项目相关联(首先过滤gwtItems之后)

在这里,在从.Join()操作返回包含相关信息的元组之前,首先使用.Join()根据各自类的Sid属性将来自adGroups gwtItems项目相关联; 然后,只选择实际具有不同名称的关联项并将其转换为更简单的元组。

如果您的原始过滤可能会从gwtItems中过滤掉许多项目,则可能应该包括在内; 但这不是获得预期结果的必要条件。

public IEnumerable<( string Name, int Id )> GetWorkTeamsWhereChangeName(
   IEnumerable<Group> adGroups,
   IEnumerable<GuidelinesWorkTeam> gwtItems)
{
    return gwtItems
        // Original filtering
        .Where(gwtItem => adGroups.Any(adGroup => 
            gwtItem.Sid == adGroup.Sid &&
            gwtItem.Name != adGroup.Name))
        // Association and final filtering
        .Join(adGroups,
            gwtItem => gwtItem.Sid,
            adGroup => adGroup.Sid,
            ( gwtItem, adGroup ) => ( 
                ChangedName: gwtItem.Name != adGroup.Name,
                Name: adGroup.Name,
                Id: gwtItem.Id))
        .Where(workTeam => workTeam.ChangedName)
        .Select(workTeam => ( workTeam.Name, workTeam.Id ));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM