2012-04-10 2 views
0

я получил два класса, как:получить элементы из списка на основе другого списка

public class Person 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

public class Vampire 
    { 
    public long Id { get; set; } 
} 

Затем, у меня есть два списка, список лиц и список вампиров. Все вампиры - это люди.

Что мне нужно, это два детских списка лиц, зараженных и неинфекционных. Я строю два списка с помощью for, но я знаю, что это возможно, используя linq или что-то в этом роде.

Любая помощь?

+0

Я использую for, теперь я ищу linq для объектов. –

+3

Разве вампир не был бы * бывшим человеком? Я думаю, вы должны быть живы, чтобы быть классифицированным как человек. ;) – Tergiver

ответ

3

Что-то вроде этого:

var vampireIds = new HashSet<long>(vampireList.Select(x => x.Id)); 
var infectedPersons = personList.Where(x => vampireIds.Contains(x.Id)); 
var regularPersons = personList.Where(x => !vampireIds.Contains(x.Id)); 
+3

Обратите внимание, что простой старый цикл foreach будет более эффективным - оба являются O (n), но для примера Linq требуются две итерации над списками лиц, тогда как вы можете сделать это в одной итерации с помощью цикла foreach , Это может иметь значение в очень больших коллекциях. – BrokenGlass

0

Если только человек может быть Vapire, вы могли бы наследовать вампира от человека, а затем перебрать всех людей и посмотреть, если они Вампиры; если да -> добавьте в список вампиров, в противном случае - список, не относящийся к вампирам.

+0

Я делаю что-то подобное, но код выглядит ужасно! haha –

1

Я бы с чем-то вроде следующий:

void Main() 
{ 
    var list = new List<Person>(){ new Person(){ Id = 1 }, new Vampire(){ Id = 2 } }; 
    var infected = list.Where (x => x is Vampire); 
    var notInfected = list.Except(infected); 
} 

public class Person 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

public class Vampire : Person 
{ 
} 
+0

Еще проще: 'var infected = list.OfType ();' Это предполагает, конечно, цепочку наследования – BrokenGlass

0

Попробуйте это:

var people = new List<Person> 
      { 
       new Person {Id = 1, Name = "John"}, 
       new Person {Name = "Dave", Id = 2}, 
       new Person {Id = 3, Name = "Sarah"} 
      }; 

var vamps = new List<Vampire> {new Vampire {Id = 1}}; 

var theInfected = people.Where(p => vamps.Select(v => v.Id).Contains(p.Id)); 

var theAfraid = people.Except(theInfected); 

foreach (var person in theInfected) 
    { 
     System.Console.WriteLine(person.Name + " Is Infected!"); 
    } 

foreach (var person in theAfraid) 
    { 
    System.Console.WriteLine(person.Name + " Is Afraid!"); 
    } 

Надеется, что это полезно.

Смежные вопросы