我正在嘗試過濾可以動態更改過濾器的人員串列。所以當我想按性別和角色過濾時,我給了這兩個過濾器。當我想將其更改為僅角色或更改角色的值時,必須使用新過濾器對串列執行另一個過濾。過濾完成后,立即檢查此人是否滿足所有過濾條件。因此,例如,對值為 true 且角色編號為 4 的性別進行過濾。然后只回傳人“Meike”。
我試過下面的代碼。此代碼會在遇到每個單獨的過濾器時再次添加每個人,因此一個人可能會在串列中出現兩次。當然這可以通過檢查他是否已經存在于串列中來解決,但我想知道下面的代碼是否是解決這個問題的“方法”。
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}");
}
人物類:
{
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;
}
}
uj5u.com熱心網友回復:
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陳述句,但前者也可以。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/359810.html
