2013-08-22 30 views
0

我有2個班LINQ的過濾器的IEnumerable對另一個IEnumerable的

public class ClassA 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

而且

public class ClassB 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ClassA ClassA { get; set; } 
} 

我想篩選ClassB的列表A類

void Main() 
    { 

    var ListA = new List<ClassA>(); 
     var a1 = new ClassA() {Id=1, Name = "A1"}; 
    var a2 = new ClassA() {Id=2, Name = "A2"}; 
    var a3 = new ClassA() {Id=3, Name = "A3"}; 
    ListA.Add(a1); 
    ListA.Add(a2); 
    ListA.Add(a3); 

    var FilterListA = new List<ClassA>(); 
    FilterListA.Add(a1); 
    FilterListA.Add(a2); 


    var ListB = new List<ClassB>(); 

    var b1 = new ClassB() {Id=1, Name="B1" ,ClassA= a1}; 
    var b2 = new ClassB() {Id=1, Name="B1", ClassA= a2}; 
    var b3 = new ClassB() {Id=1, Name="B1", ClassA= a3}; 
    var b4 = new ClassB() {Id=1, Name="B1", ClassA= a3}; 

    ListB.Add(b1); 
    ListB.Add(b2); 
    ListB.Add(b3); 
    ListB.Add(b4); 

的列表它的作品,如果我使用

var query = from b in ListB 
      join a in FilterListA 
      on b.ClassA equals a 
      select new { Name = b.Name, ClassAName = a.Name }; 

Console.WriteLine(query.ToList()); 

但我願做這樣的事情......但我不知道

Console.WriteLine(ListB.Where(o => o.ClassA IsIncluded In FilterListA)); 

}

我嘗試使用是如何包含沒有成功。感謝

+3

但你'Join'方法比你想要的'Where'與含有(或'Any')更有效。 http://stackoverflow.com/questions/5551264/why-is-linq-join-so-much-faster-than-linking-with-where –

+0

這正是我想弄明白的。加盟非常快,我必須說。我想我想知道做同樣事情的不同方式,即使它花費我幾個名譽點。 – SerenityNow

+0

20,000,000次迭代的包含約需要22秒..使用連接需要41秒....任何需要43秒。所以我想包含更快...... – SerenityNow

回答

3

這應該工作:

ListB.Where(x=>FilterListA.Any(y=>y==x.ClassA)); 

它從數組listB其中有FilterListA相當於元素的所有元素。如果列表元素中包含的ClassA的對象在FilterListA中列出,則返回該對象。

編輯: 爲gunr2171說,你可以使用Contains

ListB.Where(x=>FilterListA.Contains(x.ClassA)); 
+2

或者你可以使用'Contains' – gunr2171

+1

短語「大-O」對你來說意味着什麼? –

+0

@KennetBelenky比你想象的要多,但沒有人說它應該針對時間複雜性進行優化。這是有效的linq方法。 – wudzik

相關問題