2012-04-10 12 views
0

に基づいてリストから要素を取得:次に私のような二つのクラス、得た別のリスト

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

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

を、私は2つのリスト、人や吸血鬼のリストのリストを持っています。すべての吸血鬼は人です。

私が必要とするのは、感染した人とnotInfectedの2人の子供のリストです。私はforを使って2つのリストを構築していますが、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の例では人のリストに対して2回の反復が必要ですが、' foreach'ループを使って1回の反復で行うことができます。これは、非常に大きなコレクションでは重要です。 – 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!"); 
    } 

は、それが参考に願っています。

関連する問題