2010-04-01 46 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