使用动态添加的筛选器筛选列表



我正在尝试对一个可以动态更改筛选器的人员列表进行筛选。所以当我想按性别和角色进行过滤时,我会给出这两个过滤器。当我想将其更改为仅角色或更改角色值时,必须使用新筛选器对列表执行另一次筛选。一旦完成筛选,就会检查此人是否符合所有筛选条件。因此,例如,对值为true、角色编号为4的性别进行过滤。然后只返回"Meike"这个人。

我已经尝试了以下代码。一旦每个人遇到每个单独的过滤器,此代码就会再次添加每个人,因此一个人可能会在列表中出现两次。当然,这可以通过检查他是否已经存在于列表中来解决,但我想知道下面的代码是否是解决这个问题的"方法"。

Dictionary<string, object> _filter = new();
List<Person> _people = new List<Person>();
_people.Add(new Person(1, "Bram", false, 4));
_people.Add(new Person(2, "Harry", false, 4));
_people.Add(new Person(3, "Meike", true, 4));
_people.Add(new Person(4, "Lisa", true, 3));
Console.WriteLine("Hello World!");
List<Person> secondPersonList = new();
Dictionary<string, object> secondFilter = new();
secondFilter.Add("Gender", true);
secondFilter.Add("Role", 3);
foreach (var filter in secondFilter)
{
if(filter.Key == "Gender")
{
foreach (var person in _people.FindAll(x => x.Gender == (bool)filter.Value))
secondPersonList.Add(person);
}
if (filter.Key == "Role")
{
foreach (var person in _people.FindAll(x => x.Role == (int)filter.Value))
secondPersonList.Add(person);
}
}
Console.WriteLine("Multiple filters");
foreach(Person person in secondPersonList)
{
Console.WriteLine($"Id: {person.Id}, Name: {person.Name}");
}

人员类别:

internal class Person
{
public int Id { get; set; }
public string Name { get; set; }
public bool Gender { get; set; }
public int Role { get; set; }
public Person(int id, string name, bool gender, int role)
{
Id = id;
Name = name;
Gender = gender;
Role = role;
}
}

LINQ的好处是可以添加过滤器"在飞行中";。既然你在评论中澄清了你实际上想用AND而不是OR组合过滤器,我建议如下:

IEnumerable<Person> filtered = _people;
foreach (var filter in secondFilter)
{
switch (filter.Key)
{
case "Gender":
filtered = filtered.Where(x => x.Gender == (bool)filter.Value));
break;
case "Role":
filtered = filtered.Where(x => x.Role == (int)filter.Value));
break;
default:
// something went wrong, you might want to throw an exception here.
} 
}
// This will evaluate the filters and materialize the result
var secondPersonList = filtered.ToList();

(为了可读性,我将您的if语句更改为switch语句,但前者也可以。(

最新更新