作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试为 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/
我是一名优秀的程序员,十分优秀!