2013-11-21 5 views
0

Я пытаюсь получить список, отфильтрованный на основе совпадений одного из свойств с свойством другого списка. В приведенном ниже примере в первом списке должны быть отфильтрованы только те элементы, которые имеют общее «имя» между обоими списками. Может ли кто-нибудь сказать мне наиболее сжатый способ сделать это?Как получить отфильтрованный список на основе общих элементов в двух списках в C#

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

Каким должен быть ваш ожидаемый выход? 'TCapability',' PCapability' или что-то со строками? – AgentFire

+1

Вы пробовали ?? любая ошибка ?? –

+1

Вы должны сделать так, чтобы кто-нибудь мог попробовать ваш код. По этой причине я отредактировал ваш код. –

ответ

2
var result = capability.Where(c => type2Capability.Any(c2 => c.Name == c2.Name)); 
+2

Я бы превратил 'type2Capability' в' HashSet ', поэтому поиски являются 'O (1)', иначе это 'O (mn)' в целом, но это очень более простая альтернатива 'Join', когда вам действительно не нужны объединенные результаты. – Rawling

+1

@ Rawling Согласен! –

+0

@ MD.Unicorn Это не фильтрует результаты. Я по-прежнему получал такое же количество результатов, как и в Capability. –

1

вы можете попробовать использовать join clause как это

capability = (from a in capability 
      join b in type2Capability on a.Name equals b.Name 
      select a).ToList(); 

UPDATE на комментарий, если type2Capability может иметь одинаковые имена

capability = (from a in capability 
      join b in type2Capability on a.Name equals b.Name into f 
      where f.Any() 
      select a).ToList(); 
+0

В случае, когда 'type2Capability' имеет дублирующие свойства' Name', это даст несколько результатов - я бы использовал 'GroupJoin' (' join ... in' в синтаксисе запроса?), А затем отбросить элементы, где группа пуста. – Rawling

+1

@ Отвечая на вопрос об обновлении ответа на этот случай – Grundy

1

Если списки могут получить длинные то HashSet может ускорить процесс.

var set = new HashSet<string>(type2Capability.Select(t => t.Name)); 
var res = capability.Where(c => set.Contains(c.Name)); 
Смежные вопросы