2014-06-25 1 views
0

J'ai une application C# WinForms. Il y a une zone de liste remplie de valeurs dans ce format:Comment rechercher des éléments de la liste avec seulement une partie de son texte

category:user:id 
Food:tester:17 

etc.

Maintenant, je dois obtenir si un élément est inclus dans cette zone de liste, en sachant que la catégorie et ID, je ne connaître l'utilisateur. Ainsi, techniquement, je dois faire quelque chose comme ça (pseudo-code):

if(MyListBox.Items.Contains("Food:*:17")) 

où le * signifierait « rien ». Y-a-t'il une façon de le faire?

Répondre

2

En supposant que la zone de liste est rempli directement avec les chaînes, la meilleure façon serait une combinaison de LINQ et regex:

if(MyListBox.Items.Cast<string>().Any(s => Regex.IsMatch(s, "Food:.*:17"))) //(For RegEx: using System.Text.RegularExpressions) 

ou plus stricte, si les éléments sont toujours une combinaison de valeur: valeur: valeur et vous ne vérifiez que la première et la troisième valeur:

if (MyListBox.Items.Cast<string>().Any(s => { var values = s.Split(':'); return values[0] == "Food" && values[2] == "17"; })) 
+0

solution très intéressante, Je vous remercie :) –

0

essayer quelque chose comme ça

var res = 
       MyListBox.items.SingleOrDefault(
        item => 
        item.Contains("Food:") && item.Contains(":17") && 
        item.IndexOf(":17", StringComparison.InvariantCulture) > 
        item.IndexOf("Food:", StringComparison.InvariantCulture)); 
       if (!string.IsNullOrEmpty(res)) 
      { 
       //your code here 
      } 



      } 
+0

Cela voudrait dire que je me « vrai » en cas de nourriture, et tout ID 17, j'ai besoin pour être à la fois dans un élément –

+0

qui est vrai corrigé grâce –

0

Vous pourriez faire quelque chose comme

var value = MyListBox.Items.Cast<string>() 
    .FirstOrDefault(m => m.Contains("Food:") && m.Contains(":17")); 
if (value != null) { 
    // you have a match 
} 
Questions connexes