2010-04-01 95 views
0

我試圖讓所有不從一個指定的類繼承的子列表,也得到父/根列表類型。我無法弄清楚語法。這是我正在尋找的那種事情的一個例子。謝謝你提供的所有幫助!LINQ列表子列表

public class Foo 
{ 
    public IList<Type> Bar { get; private set; } 
} 

List<Foo> test = new List<Foo>(); 
// Initialize, add values, etc. 

var result = from f in test 
      from b in f.Bar 
      where !b.IsSubclassOf(typeof(AnotherClass)) 
      select f.GetType(), b 
+0

對我來說,問題並不清楚:你能否更清楚地給出一個示例輸入和相關輸出(甚至只是草圖)? – 2010-04-01 19:17:16

回答

0

這是你在找什麼?

class Foo 
{ 
    public IList<object> Bar { get; set; } 
} 

...

Foo foo = new Foo(); 
foo.Bar = new List<object>(); 
foo.Bar.Add(1); 
foo.Bar.Add("a"); 

Foo foo2 = new Foo(); 
foo2.Bar = new List<object>(); 
foo2.Bar.Add(2); 
foo2.Bar.Add('b'); 

List<Foo> foos = new List<Foo>() { foo, foo2 }; 

var query = from f in foos 
      from b in f.Bar 
      where !(b is string) 
      select new 
      { 
       InnerObjectType = b.GetType(), 
       InnerObject = b 
      }; 

foreach (var obj in query) 
    Console.WriteLine("{0}\t{1}", obj.InnerObjectType, obj.InnerObject); 

編輯:如果排除類型是一個參數,你可以修改的where子句是

where b.GetType() != type 

IEnumarable<T>有一個擴展方法的OfType<>這將是有用的,當你想限制選擇一個給定的類型,這將是很好,如果有一個排除alterna tive(或者如果有,我不知道它)。如果有的話,你可以在f.Bar上使用它,並刪除where子句。

+0

關閉,但不是InnerObjectType而應該是OuterObjectType = f.GetType()。此外,我不希望它匹配基類,只有派生類,所以我必須做IsSubclassOf(),但這是一個非LINQ細節。我錯過了新的{} – 2010-04-01 20:51:05

1

也許是這樣的:

var result = test.SelectAll(i => i.Bar).Where(i => !(i is AnotherClass)).Select(i => new { Type = i.GetType(), Item = i}); 

PS:在第三次嘗試:)

+0

不完全...我需要選擇f.GetType(),而不是i.GetType()。儘管安東尼做了同樣的事情,但改變他更容易。 :) – 2010-04-01 20:47:57