如何根据c#中两个列表中的常用项获取筛选列表

时间:2013-11-21 07:44:31

标签: c# list

我正在尝试根据其中一个属性与另一个列表属性的匹配来过滤列表。 在下面的示例中,只应在第一个列表中过滤两个列表之间具有共同“名称”的项目。有人可以告诉我最简洁的方法吗?

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

3 个答案:

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