C#泛型函数,用于根据条件搜索对象,还支持将来的属性

C#泛型函数,用于根据条件搜索对象,还支持将来的属性,c#,list,generics,C#,List,Generics,所以我有一个类: public class Person { public string Name { get; set; } public string Id{ get; set; } } 我有这个收藏: List<Person> persons = new List<Person>(); 所以现在我想知道如何编写泛型的函数,在一些属性的基础上搜索特定的人对象,这个函数还需要支持将来的属性,而这个属性目前还不存在,但如

所以我有一个

public class Person
    {
        public string Name { get; set; }
        public string Id{ get; set; }
    }
我有这个
收藏

List<Person> persons = new List<Person>();

所以现在我想知道如何编写泛型的
函数
,在一些
属性
的基础上搜索特定的
对象,这个
函数
还需要支持将来的
属性
,而这个属性目前还不存在,但如果它将添加到我的类
,它也将支持有效。

实际上,
Find
-方法已经做到了这一点,没有必要为您创建自己的方法,除非您不想将列表公开给类外部

在这种情况下,使您的
搜索
-方法期望:

如果有多个对象符合您的条件,您可以使用
List.FindAll(谓词)
IEnumerable.Where(谓词)
。但是,对于后者,您必须使用
Func
而不是
谓词

public IEnumerable搜索(Func谓词)
{
返回人。Where(谓词);
}

它的使用方法与上述示例完全相同(只是它返回一个项目集合,而不是单个项目)。

实际上,
Find
-方法已经做到了这一点,没有必要为您创建自己的方法,除非您不想将列表公开给类外部

在这种情况下,使您的
搜索
-方法期望:

如果有多个对象符合您的条件,您可以使用
List.FindAll(谓词)
IEnumerable.Where(谓词)
。但是,对于后者,您必须使用
Func
而不是
谓词

public IEnumerable搜索(Func谓词)
{
返回人。Where(谓词);
}

它的使用方法与上述示例完全相同(只是它返回一个项目集合,而不是单个项目)。

您不想使用
Find
-方法吗?它已经实现了您想要的功能:通过谓词进行搜索。所以,如果你公开了
,你可以在上面调用
Find
。否则,使您的
Search
-方法期望一个
Func
,并将该参数传递给
Find
Find
-方法不是您想要的吗?它已经实现了您想要的功能:通过谓词进行搜索。所以,如果你公开了
,你可以在上面调用
Find
。否则,使您的
Search
-方法期望一个
Func
,并将该参数传递给
Find
。2个问题:1。请告诉我如何使用示例2中的方法。如果我添加了另一个名为int Age的属性,并且我想搜索年龄大于某个值的人,如果我有多个对象可以进行搜索,该怎么办?@erofhor-您定义了方法来返回单个
人,并调用了另一个设计用于此操作的方法。如果您想返回倍数,那么现有的方法也可以这样做,例如or。2个问题:1。请告诉我如何使用示例2中的方法。如果我添加了另一个名为int Age的属性,并且我想搜索年龄大于某个值的人,如果我有多个对象可以进行搜索,该怎么办?@erofhor-您定义了方法来返回单个
人,并调用了另一个设计用于此操作的方法。如果您想返回倍数,那么现有的方法也可以这样做,例如or。
public Person Search(string property )
{
    return persons.Find(x => x.Name == property);
}
public Person Search(Predicate<Person> predicate)
{
    return persons.Find(predicate);
}
Person p = myClass.Search(x => x.Name == "Me");
Person p = myClass.Search(x => x.Age > 40);
public IEnumerable<Person> Search(Func<Person, bool> predicate)
{
    return persons.Where(predicate);
}
public T Search<T>(IEnumerable<T> source, Func<T, bool> filter)
{
    return source.FirstOrDefault(filter);
}
var erofh = Search(people, q => q.Name == "Erofh Tor");