2010-09-20 2 views
4

J'ai une liste comme ceci:FindAll recherche question

item.Add("a"); 
item.Add("as"); 
item.Add("b"); 
item.Add("fgs"); 
item.Add("adsd"); 

Comment puis-je trouver tous les articles qui commencent par (par exemple) "a"? Ce "a" n'est pas une chaîne codée en dur, donc j'aurai besoin d'une fonction qui le fera pour chaque chaîne.

J'essaie avec FindAll, mais je n'ai pas compris comment cela fonctionne.

Br, Wolfy

Répondre

7

Si par "commencer par" vous voulez dire le premier char, puis:

item.FindAll(i => i[0] == 'a'); 

si vous voulez dire une chaîne (peut être autre que 1 char) puis:

item.FindAll(i => i.StartsWith("a")); 

Si vous voulez une comparaison différente, comme insensible à la casse, à base locale, etc. puis effectuez les opérations IndexOf pertinentes telles que:

item.FindAll(i => i.IndexOf("a", StringComparison.CurrentCultureIgnoreCase) == 0); 

Toutes les ci-dessus peut être facilement adapté pour utiliser une variable ou un paramètre char ou chaîne pertinent.

Si vous ne avez pas besoin des propriétés supplémentaires et les méthodes fournies par une liste, alors il sera plus efficace d'utiliser Where que FindAll comme FindAll crée une nouvelle liste, et le fait en une seule fois, alors que Where énumérerons les résultats correspondants tels qu'ils sont itérés.

0

Essayez cette

item.FindAll(i => i.Contains("a")); 

Ceci renvoie une liste containting uniquement les chaînes filtrées.

+3

Cela ne devrait-il pas être «StartsWith» au lieu de «Contient»? –

+0

@Brian: Cela aurait dû être StartsWith. J'ai lu sa question un peu rapidement. –

2

Ou avec LINQ

from i in items where i.StartsWith("a") select i; 
1

pour NET2.0 vous pouvez utiliser cette méthode: 'pattern' est un argument de chercher (fe "a")

private List<string> FindAll(List<string> list, string pattern) 
    {  // returns found results 
      return list.FindAll(delegate(string item) 
          { 
           return item.StartsWith(pattern); 

          }); 
    } 
1

Je pensais que vous avoir une autre liste qui contient les chaînes de critères startswith. Appelons vos articles "mots" et l'autre liste "mots-clés". Donc, la requête ci-dessous va retourner ce que vous voulez.

List<string> words = new List<string>(); 
words.Add("a"); 
words.Add("as"); 
words.Add("b"); 
words.Add("fgs"); 
words.Add("adsd"); 

List<string> keywords = new List<string>(); 
keywords.Add("a"); 
keywords.Add("b"); 

var result = words.FindAll(o => 
    keywords.Any(a => o.StartsWith(a)) 
); 

Ce résultat contient les mots commençant par l'un des mots-clés parmi les mots-clés.

+0

+1 Je pense que c'est ce que veut OP. Et une suggestion: changer le nom de la variable de "liste" en "mots-clés" et changer "élément" en "mots". –

+0

Merci Danny Chen. J'ai édité ma réponse en fonction de votre suggestion. –

1
List<string> item = new List<string>(); 
      item.Add("a"); 
      item.Add("as"); 
      item.Add("b"); 
      item.Add("fgs"); 
      item.Add("adsd"); 

      var res1 = item.FindAll(i => i.StartsWith("a")); 
      var res2 = item.Where(i => i.StartsWith("a"));