2014-04-21 60 views
4

我試圖根據Baa的第二個列表中的一些值過濾我的第一個Foo列表。如何通過單個屬性來交叉兩個不同的.NET列表?

例如。

這裏的an example I put up on .NET Fiddle ...

var foos = new List<Foo> 
{ 
    new Foo { Name = "Leia" }, 
    new Foo { Name = "Han Solo" }, 
    new Foo { Name = "Chewbacca" }, 
    new Foo { Name = "Luke" }, 
}; 

    var baas = new List<Baa> 
{ 
    new Baa { Alias = "aaaaa" }, 
    new Baa { Alias = "bbbb" }, 
    new Baa { Alias = "Leia" }, 
    new Baa { Alias = "Luke" } 
}; 

// Expected output: 
// List<Foo> results = Foo { "Leia" } and Foo { "Luke" }; 

看我怎麼這麼問的:篩選第一列表(由Name)由第二列表Alias財產。

這將返回一個列表Foo其中有2個結果嗎?

任何線索?在一個完整的工作.NET小提琴

var query = 
    from f in foos 
    join b in baas on f.Name equals b.Alias 
    select f; 

Here's the code

+2

如果您的集合包含很多項目,那麼使用'HashSet'而不是'List'可能是明智的。檢查一個項目是否包含在HashSet中是一個O(1)操作,它可以極大地提高計算交集的速度。在'HashSet'類中有一個專門的方法,請參閱:http://msdn.microsoft.com/en-us/library/vstudio/bb918911%28v=vs.90%29.aspx – Benlitz

+0

*非常*好點@Benlitz!在我的情況下,每個列表將只是幾個項目。但是答案真的可以幫助我將來的開發,我可能不得不處理列表交集。如果兩個集合都是'HashSet',我們很希望看到一些使用'Intersects'關鍵字的示例代碼。 –

+0

@ Pure.Krome不能使用'Intersect',因爲這些列表有兩種不同的類型。 –

回答

9

可以的baas名單上使用Any

foos.Where(f => baas.Any(b => b.Alias == f.Name)); 

或(在查詢語法清潔劑)使用連接。

5

你可以使用Join

var results = foos.Join(baas, f => f.Name, b => b.Alias, (f, b) => f); 

類似this answer

相關問題