2017-10-11 14 views
2

Je souhaite filtrer dans la classe User propriétés de chaîne dans n'importe quel ordre.Filtrer par les propriétés de chaîne de classe

Ma classe User ressemble à ceci:

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}"; 
    } 
} 

Et mon algorithme de filtre ressemble à ceci:

private readonly List<User> _userList = new List<User>(); 

    public Form1() 
    { 
     InitializeComponent(); 

     _userList.Add(new User("Zar", "Nikolaus II", "[email protected]")); 
     _userList.Add(new User("Tommy", "Hilfiger", "[email protected]")); 
     _userList.Add(new User("Nina", "Richy", "[email protected]")); 
     _userList.Add(new User("Armin", "Van Buren", "[email protected]")); 
     _userList.Add(new User("Lauren", "Ralph", "[email protected]")); 
     _userList.Add(new User("Van der Vaart", "(Marin-) Rafael", "[email protected]")); 
     _userList.Add(new User("Tommy", "Vercetti", "[email protected]")); 
    } 

    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)))); 
    } 

Maintenant, mon objectif est d'obtenir la suite des résultats avec le filtre suivant:

Filtrer: Tom

  1. Tom mon Hilfiger - [email protected]
  2. Tom mon Vercetti - [email protected]

Filtre: van

  1. Van der Vaart (Marin-) Rafael - [email protected]
  2. Armin Van Buren - [email protected]

Filtre: rafa va

  1. Va n der Va art (Marin-) Rafa el - football @ stackoverflow.bom
  2. Armin Va n Buren - [email protected]

Filtre: ra

  1. Lauren Ra lph - [email protected]
  2. Van der Vaart (Marin-) Ra Fael - [email protected]
  3. Tommy Vercetti - cha ra [email protected]
+0

Bon, alors où vous rencontrez des problèmes sont? Je séparerais d'abord les aspects «faire des choses avec réflexion» des «chaînes de caractères avec des expressions régulières». Ils sont orthogonaux, et votre question SO devrait être sur * un * de ceux-là, et un seul. (Dans les deux cas, un [mcve] serait utile - aucune interface utilisateur n'est requise.) –

Répondre

1

Il semble que la seule astuce est de mettre ToString()-FirstName, LastName, Email combinaison lors de l'appariement:

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))); 
+0

Woow - merci pour ce bon exemple –