[英]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.Name
和gwtItem.Id
)元素,但用adGroup.Name
替换gwtItem.Name
。
我怎样才能做到这一点?
根据我对您问题的理解,我想提出两种不同的解决方法:
adGroups
项目与adGroups
项目相关联之前过滤gwtItems
中的项目gwtItems
中的项目,然后)将gwtItems
项目与adGroups
项目相关联根据哪个变量( adGroups
或gwtItems
)从最初过滤中获益最多,您可以选择最适合您的用例的方法。
adGroups
项目,然后将它们与gwtItems
项目相关联在这里,在每个基于Sid
的分组根据 gwtItem 的Sid
值与来自gwtItems
的项目相关联之前, adGroups
中的所有适用项目都按Sid
分组。 在使用.Join()
将adGroups
分组和gwtItems
与相等的Sid
(和不相等的Name
,由于adGroups
的初始过滤)相关联之后,我们 select 每个关联的 adGroup 和 gwtItem 对的adGroup.Name
和gwtItem.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.