我想以任意顺序过滤 User
类字符串属性。
我的 User
类如下所示:
internal class User
{
public string FirstName { get; }
public string LastName { get; }
public string Email { get; }
public User(string firstName, string lastName, string email)
{
FirstName = firstName;
LastName = lastName;
Email = email;
}
public override string ToString()
{
return $"{FirstName} {LastName} - {Email}";
}
}
我的过滤算法是这样的:
private readonly List<User> _userList = new List<User>();
public Form1()
{
InitializeComponent();
_userList.Add(new User("Zar", "Nikolaus II", "ruler@stackoverflow.bom"));
_userList.Add(new User("Tommy", "Hilfiger", "polo@stackoverflow.bom"));
_userList.Add(new User("Nina", "Richy", "thin-thing@stackoverflow.bom"));
_userList.Add(new User("Armin", "Van Buren", "singer@stackoverflow.bom"));
_userList.Add(new User("Lauren", "Ralph", "polo@stackoverflow.bom"));
_userList.Add(new User("Van der Vaart", "(Marin-) Rafael", "soccer@stackoverflow.bom"));
_userList.Add(new User("Tommy", "Vercetti", "character@stackoverflow.bom"));
}
private void FilterIt()
{
var filter = textBox1.Text;
var properties = typeof(User).GetProperties();
var filteredUsers = this._userList.Where(user => properties.Any(propInfo => Regex.Split(propInfo.GetValue(user).ToString(), @"\W").Any(w => filter.Contains(w))));
}
现在我的目标是使用以下过滤器获得以下结果:
筛选:汤姆
- Tom我的 Hilfiger - polo@stackoverflow.bom
- Tom我的 Vercetti - character@stackoverflow.bom
筛选:面包车
- Van der Vaart (Marin-) Rafael - soccer@stackoverflow.bom
- Armin Van Buren - singer@stackoverflow.bom
过滤器:拉法瓦
- Van der Vaart (Marin-) Rafael - soccer@stackoverflow.bom
- Armin Van Buren - singer@stackoverflow.bom
过滤器:ra
- 劳伦 Ralph - polo@stackoverflow.bom
- 范德法特 (Marin-) Rafael - soccer@stackoverflow.bom
- Tommy Vercetti - character@stackoverflow.bom
最佳答案
似乎唯一的技巧是将 ToString()
- FirstName
, LastName
, Email
组合匹配时:
string filter = "rafa va";
// We assume that
// 1. Patterns are separated by space (or tabulation)
// 2. Patterns should be matched in any order
// 3. Case should be ignored
var patterns = filter
.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)
.Select(item => Regex.Escape(item)) // <- comment it out if you want to allow, say, \d+
.ToArray();
var result = _userList
.Where(user => patterns
.All(pattern => Regex.IsMatch(user.ToString(), pattern, RegexOptions.IgnoreCase)));
关于c# - 通过类字符串属性过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46681803/