2013-05-07 3 views
1

Quelqu'un peut-il me dire, pourquoi je ne reçois aucune sortie avec ceci sur buttonclick?Chaîne de recherche Arraylist mais aucune sortie

string searchString = TextBox1.Text; 
ArrayList personarraylist = new ArrayList(); 
foreach (Person a in personarraylist) 
{ 
    if (searchString == Convert.ToString(a)) 
    { 
     personarraylist.Add(a); 
    } 
} 
ListBox1.DataSource = personarraylist; 

EDIT:

Salut à tous, merci pour vos commentaires. J'ai une classe pour Person, et toutes les données créées sur les pages sont stockées dans un fichier: FileController.ReadFile (Server.MapPath ("~/App_Data/Personfile.ser")); C'est de là que j'ai besoin de mes données. J'utilise une classe Filecontroller pour écrire et lire (également mettre à jour) vers et à partir du fichier. Mais la fonction de recherche vient d'avoir la meilleure partie de moi. (en tant qu'étudiant, le traitement des données dans le fichier était requis, ou j'aurais utilisé une base de données). J'espère que cela efface un peu mon code. Et dois-je comparer le terme de recherche à quelque chose par exemple, ou peut-il fonctionner à travers le fichier entier?

+0

Sur la base de vos questions précédentes que vous avez tableau de personne statique et aussi ToString remplacement de la méthode de la classe de personne afin que vous puissiez essayer 'ListBox1 .DataSource = personarraylist.Where (p => p.ToString(). Contient (TextBox1.Text)). ToList(); ' – Damith

Répondre

3

Vous créez une nouvelle liste de tableau, puis immédiatement foreach dessus. Puisque vous venez de le créer, il n'y a aucun élément, donc le foreach ne fait rien.

+0

Bien repéré - seulement remarqué que moi-même lors de l'édition. Je soupçonne que ce n'est pas * tout * ce qui est nécessaire cependant. –

+0

@JonSkeet C'est certainement possible, mais c'est la seule chose que nous pouvons * savoir * qui ne va pas avec le code donné. – Servy

+0

Je dirais qu'ajouter à la même 'ArrayList' qu'il cherche est à peu près * connu * pour être faux, n'est-ce pas? (Cela provoquera une exception s'il y a des correspondances ...) –

0

Vous convertissez l'objet Personne en chaîne. Vous pourriez vouloir regarder un élément dans l'objet Person pour les données que vous voulez comparer.

1

EDIT: Um, vous êtes à la recherche dans un videArrayList:

ArrayList personarraylist = new ArrayList(); 
foreach (Person a in personarraylist) 
{ 
    ... 
} 

Ce ne va jamais entrer dans le corps du ArrayList. Je pense que vous vouliez dire quelque chose comme:

ArrayList people = GetAllPeopleFromSomewhere(); 
foreach (Person a in people) 
{ 
    ... 
} 

De plus, même si vous fait ont des valeurs à regarder à travers, il est tout à fait possible que Convert.ToString(a) ne reviendraient pas la valeur pour effectuer des recherches. À moins que votre classe Person ne remplace ToString(), vous obtiendrez simplement le nom de la classe. Il est plus probable que vous voulez vraiment quelque chose comme:

if (a.FirstName == searchString) 

(. Ou tout propriété de Person vous voulez réellement rechercher)

Ensuite, vous êtes en train d'ajouter à la même ArrayList que vous êtes chercher à travers - ce n'est pas ce que vous voulez. Vous pourriez vouloir quelque chose comme:

ArrayList people = GetAllPeopleFromSomewhere(); 
ArrayList matches = new ArrayList(); 
foreach (Person a in people) 
{ 
    if (a.FirstName == searchString) 
    { 
     matches.Add(a); 
    } 
} 

Je suggère également d'utiliser des collections génériques, et idéalement LINQ. Par exemple, avec LINQ votre code entier pourrait être converti en quelque chose comme ceci:

ListBox1.DataSource = GetAllPeople().Where(p => p.FirstName == searchString); 
0
string searchString = TextBox1.Text; 
ArrayList personarraylist = new ArrayList(); 
foreach (Person a in originalpersonarraylist) 
{ 
    //Assuming that there is a Name property in Person Class. 
    if (a.Name.StartsWith(searchString)) 
     personarraylist.Add(a); 
} 
ListBox1.DataSource = personarraylist; 
0

Vous devez remplir le paramètre personarraylist avec des valeurs avant de commencer foreach loop. Quelque chose comme cela devrait être plus usful:

string searchString = Textbox1.Text; 
//Retrive the person data for some location 
ArrayList personarraylist = getPersonData(); 
foreach (Person a in personarraylist) 
{ 
    if (searchString.contains(a.ToString())) 
    { 
     personarraylist.Add(a); 
    } 
} 
ListBox1.DataSource = personarraylist; 
0

opération requise peut être complétée de manière assez simple et efficace en utilisant réseau régulier (string[]) au lieu de ArrayList.La solution est décrite ci-dessous:

  1. Lire le fichier entier comme une seule chaîne et l'affecter à string _tmp var (utiliser un objet/méthodes que vous connaissez, pour par exemple System.IO.StreamReader)

  2. Appliquer Split() méthode pour obtenir le tableau string[] de _tmp:

    string[] _arrPerson= _tmp.Split(string[] separator);

  3. Populate ListBox1 de ce tableau _ arrPerson basé sur une condition de recherche que vous avez spécifié en utilisant la méthode Items.Add() de ListBox1:

    for (int i = 0; i < _arrPerson.Length; i ++) { si (_arrPerson [i] .Contains (searchString)) {ListBox1.Items.Add (_arrPerson [i]);}}

Cet extrait de code devrait fonctionner beaucoup plus rapidement que toutes les variations que utiliz ArrayList.

Espérons que cela aidera. My Best, AB

PS: voir MSDN link pour plus de détails sur String.Split() Méthode