【问题标题】:LINQ selection by type of an object按对象类型选择 LINQ
【发布时间】:2010-10-01 20:10:36
【问题描述】:

我有一个集合,其中包含两种类型的对象 A 和 B。

Class Base{}
Class A : Base {}
Class B : Base {}

List<Base> collection = new List<Base>();
collection.Add(new A());
collection.Add(new B());
collection.Add(new A());
collection.Add(new A());
collection.Add(new B());

现在我想根据其类型(A 或 B,而不是两者)从集合中选择对象。

如何为此编写 LINQ 查询?否则我需要遍历集合,我不想这样做。

编辑:

感谢大家的帮助。现在我可以使用 LINQ 中的 OfType()。但我认为在我的情况下它不会起作用。我的情况是

Class Container
{
  List<Base> bases;
}

List<Container> containers = new List<Container>();

现在我想从容器中选择容器,它至少有一个类型 A。也许这不能由 LINQ 完成。

【问题讨论】:

  • 你能扩展你的编辑吗? “选择容器”是什么意思?
  • 我也不明白。

标签: c# linq c#-3.0


【解决方案1】:

您可以为此使用OfType Linq 方法:

var ofTypeA = collection.OfType<A>();

关于你不愿意循环遍历集合,你应该记住 Linq 不做魔术;我没有检查OfType 的实现,但我会很惊讶没有在那里找到循环或迭代器。

【讨论】:

  • 谢谢弗雷德里克。我还有一个问题,如果不止一个人回答正确,我需要将哪个答案作为“正确答案”?
  • @Jai:您应该标记您认为最有用或最有帮助的答案。 Jared 和 Fredrik 都是正确的,但 Fredrik 的回答更深入,可能会帮助您了解更多信息。
  • @Jai:掷硬币?这里有一个硬币翻转器,如果你需要一个:random.org/coins/?num=1&cur=20-novelty.voting-2004 - 在我和@JaredPar 之间找不到投票硬币,所以你将不得不与 Kerry vs. Bush 有关。我会让你决定谁是谁;)
【解决方案2】:

为了完整起见,这里是Enumerable.OfType&lt;T&gt;的源代码。

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
    if (source == null) throw Error.ArgumentNull("source"); 
    return OfTypeIterator<TResult>(source); 
}

static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) {
        if (obj is TResult) yield return (TResult)obj;
    } 
}

你可以看到它懒惰地评估源流。

【讨论】:

    【解决方案3】:

    您可以为此使用 OfType 扩展方法

    IEnumerable<A> filteredToA = list.OfType<A>();
    IEnumerable<B> filteredToB = list.OfType<B>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2022-11-30
      • 2012-04-17
      相关资源
      最近更新 更多