c# - 通过类字符串属性过滤

标签 c# regex linq

我想以任意顺序过滤 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))));
    }

现在我的目标是使用以下过滤器获得以下结果:

筛选:汤姆

  1. Tom我的 Hilfiger - polo@stackoverflow.bom
  2. Tom我的 Vercetti - character@stackoverflow.bom

筛选:面包车

  1. Van der Vaart (Marin-) Rafael - soccer@stackoverflow.bom
  2. Armin Van Buren - singer@stackoverflow.bom

过滤器:拉法瓦

  1. Van der Vaart (Marin-) Rafael - soccer@stackoverflow.bom
  2. Armin Van Buren - singer@stackoverflow.bom

过滤器:ra

  1. 劳伦 Ralph - polo@stackoverflow.bom
  2. 范德法特 (Marin-) Rafael - soccer@stackoverflow.bom
  3. 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/

相关文章:

c# - 在 ASP.NET 中显示谁在线

c# - DbContext 只是我的数据库在内存中的架构或架构和记录

c# - 在 c# 前面快速插入字符串

c# - 这真的是您使用 Linq-To-Sql 的方式吗?

java - 正则表达式分组行为异常

python - 从reddit获取顶级壁纸

Javascript BBCode 解析器只识别第一个列表元素

c# - 使用 Entity Framework 6 调用数据库函数

linq - 将 LINQ 应用到对象分组依据和排序依据到泛型 List<T> (C#)

c# - 左侧对象不是一行中的空运算符