Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过滤函数的奇签名_C# - Fatal编程技术网

C# 过滤函数的奇签名

C# 过滤函数的奇签名,c#,C#,昨天有人问了我一个问题,这让我很困惑。我被要求实现接口ipeoplifinder: public interface IPeopleFinder { IEnumerable<Person> GetByAge(List<Person> people, int age); IEnumerable<Person> Find<TType>(Func<IEnumerable<TType>, bool> filter);

昨天有人问了我一个问题,这让我很困惑。我被要求实现接口
ipeoplifinder

public interface IPeopleFinder
{
    IEnumerable<Person> GetByAge(List<Person> people, int age);
    IEnumerable<Person> Find<TType>(Func<IEnumerable<TType>, bool> filter);
}
只需将
过滤器
传递给
IEnumerable.Where()
函数即可

有人能解释一下过滤函数如何接受
IEnumerable
并返回
bool
吗?我开始认为这是一个打字错误,应该是
Func

关于限制的澄清:

类的定义如下:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ushort Age { get; set; }
    public Sex Sex { get; set; }
}

public class Student : Person
{
    public Major Major { get; set; }
}

public class Teacher : Person
{
    public Department Department { get; set; }
}
t类型
仅限于
Person类型


问题的编写方式,一旦
Find
方法实施,它将用于查找某一学科的所有
学生,以及属于某一部门的所有
教师

显然,该方法应该适用于枚举的枚举,例如

var l = new List<List<Student>>();
编辑:对于一个实际用例,将学校想象成一个班级列表,其中每个班级本身都有一个
学生
教师
的列表。现在,您希望得到所有这些类的
Person
(假设
Student
Teacher
继承自
Person
)数量超过给定数量(在我的示例中为30个)。最后,该方法可以将生成的子列表展平为一个类型为
Person
的枚举,以获得满员班级中的所有学生和教师


EDIT2:由于您关注的是人员的属性,而不是列表,您当然应该——正如您已经假设的那样——使用
Func
TType:Person
。对我来说似乎也是一种类型。

我同意你的分析,我想知道你从哪里得到了什么样的规范

定义
ipeoplifinder
接口的人员不仅应该编写代码,还应该记录它,至少在源代码中,更好的做法是:在需求文档中描述接口的原因,在软件架构文档中定义上下文,并在设计文档中描述详细用途


只要您只有接口,没有进一步的描述,就抛出一个
NotImplementedException
,因为它没有定义您应该做其他事情。

您的意思是输入错误应该是
Func
,您可能希望将此添加到您的问题中。如果是,我同意你的看法。我会更新到Reflect。我想你必须要求澄清
TType
Person
之间的关系。我有点希望看到一个通用约束,它强制
TType
类型为
Person
或派生类型。另外,可以肯定的是,
学生
老师
继承自
个人
,对吗
GetByAge
看起来也很奇怪:为什么它需要一个人员列表,而
Find
方法不需要?是否应
GetByAge
在给定的人员列表中搜索,并
在学生和教师列表中查找?是的,我要求澄清。我不明白为什么这应该是“显而易见的”。从签名上看是显而易见的。然而,正如您已经提到的,签名有点令人困惑。如果您想根据
列表
属性和方法进行筛选,这将是可行的,但是如果你想过滤学生的一个属性,这将如何应用呢?签名清楚地表明你是根据列表本身而不是包含的对象过滤的,不是吗?签名的书写方式,这就是我所期望的。我用额外的限制条件更新了这个问题。很抱歉给你带来了困惑。
IEnumerable<Person> Find<TType>(Func<TType, bool> filter);
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ushort Age { get; set; }
    public Sex Sex { get; set; }
}

public class Student : Person
{
    public Major Major { get; set; }
}

public class Teacher : Person
{
    public Department Department { get; set; }
}
var l = new List<List<Student>>();
myPeopleFinder.Find(x => x.Count() > 30)