gpt4 book ai didi

c# - 如何在具有良好调用语法的 LINQ 中实现 NotOfType

转载 作者:IT王子 更新时间:2023-10-29 04:26:40 24 4
gpt4 key购买 nike

我正在尝试为 NotOfType 提出一个实现方案,它具有可读的调用语法。 NotOfType应该是 OfType<T> 的补充并因此产生所有不是 T 类型的元素

我的目标是实现一个像OfType<T> 一样被调用的方法,就像这段代码的最后一行:

public abstract class Animal {}
public class Monkey : Animal {}
public class Giraffe : Animal {}
public class Lion : Animal {}

var monkey = new Monkey();
var giraffe = new Giraffe();
var lion = new Lion();

IEnumerable<Animal> animals = new Animal[] { monkey, giraffe, lion };

IEnumerable<Animal> fewerAnimals = animals.NotOfType<Giraffe>();

但是,我无法想出支持该特定调用语法的实现。

这是我到目前为止尝试过的:

public static class EnumerableExtensions
{
public static IEnumerable<T> NotOfType<T>(this IEnumerable<T> sequence, Type type)
{
return sequence.Where(x => x.GetType() != type);
}

public static IEnumerable<T> NotOfType<T, TExclude>(this IEnumerable<T> sequence)
{
return sequence.Where(x => !(x is TExclude));
}
}

调用这些方法如下所示:

// Animal is inferred
IEnumerable<Animal> fewerAnimals = animals.NotOfType(typeof(Giraffe));

// Not all types could be inferred, so I have to state all types explicitly
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Animal, Giraffe>();

我认为这两种调用的风格都存在重大缺陷。第一个遭受冗余的“类型/类型”结构的困扰,第二个就没有意义(我想要一份既不是动物也不是长颈鹿的动物列表吗?)。

那么,有没有办法实现我想要的呢?如果没有,在该语言的 future 版本中是否可能? (我在想也许有一天我们会命名类型参数,或者我们只需要显式提供无法推断的类型参数?)

还是我太傻了?

最佳答案

我不确定你为什么不直接说:

animals.Where(x => !(x is Giraffe));

这对我来说似乎完全可读。这对我来说肯定比 animals.NotOfType<Animal, Giraffe>() 更直接如果我遇到它,我会感到困惑……第一个永远不会让我感到困惑,因为它立即可读。

如果你想要一个流畅的界面,我想你也可以在 Object 上使用扩展方法谓词来做这样的事情:

animals.Where(x => x.NotOfType<Giraffe>())

关于c# - 如何在具有良好调用语法的 LINQ 中实现 NotOfType<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com