我正在尝试根据其中一个属性与另一个列表属性的匹配来过滤列表。 在下面的示例中,只应在第一个列表中过滤两个列表之间具有共同“名称”的项目。有人可以告诉我最简洁的方法吗?
class TCapability
{
public string Name { get; set; }
public int Id { get; set; }
}
class PCapability
{
public string Name { get; set; }
public int Code { get; set; }
}
输入:
var capability = new List<TCapability>()
{
new TCapability() {Name="a", Id=1},
new TCapability() {Name="b", Id=2},
new TCapability() {Name="c", Id=3}
};
var type2Capability = new List<PCapability>()
{
new PCapability() {Name="a", Code=100},
new PCapability() {Name="b", Code=200},
new PCapability() {Name="d", Code=300}
};
预期产出:
capability =
{
{ Name="a", Id=1 },
{ Name="b", Id=2 }
}
答案 0 :(得分:2)
var result = capability.Where(c => type2Capability.Any(c2 => c.Name == c2.Name));
答案 1 :(得分:1)
您可以尝试使用join clause这样的
capability = (from a in capability
join b in type2Capability on a.Name equals b.Name
select a).ToList();
如果type2Capability可以有重复的名称,则评论更新
capability = (from a in capability
join b in type2Capability on a.Name equals b.Name into f
where f.Any()
select a).ToList();
答案 2 :(得分:1)
如果列表可以变长,那么HashSet可以加快速度。
var set = new HashSet<string>(type2Capability.Select(t => t.Name));
var res = capability.Where(c => set.Contains(c.Name));