2013-05-07 20 views
1

任何人都可以告诉我,为什么我在buttonclick上没有得到任何输出?Arraylist搜索字符串,但没有输出

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

编辑:

大家好,感谢您的输入。我有一个Person类,并且在页面上创建的所有数据都存储在一个文件中:FileController.ReadFile(Server.MapPath(“〜/ App_Data/Personfile.ser”));这是我需要我的数据的地方。我使用Filecontroller类来写入和读取(也更新)文件。但搜索功能已经成为我的更好的一部分。 (作为学生,文件中的数据处理是必需的,否则我会使用数据库)。希望这可以清楚我的代码。我是否必须将搜索词与某个名字进行比较,还是可以在整个文件中工作?

+0

根据你前面的问题,你有静态数组的人,也对人类的toString方法重写,所以你可以试试'ListBox1中.DataSource = personarraylist.Where(p => p.ToString()。Contains(TextBox1.Text))。ToList();' – Damith 2013-05-07 17:10:54

回答

3

你马上创建一个新的数组列表,然后foreach了它。由于您刚刚创建了它,因此没有任何项目,因此foreach什么都不做。

+0

好吧,发现 - 只在编辑时注意到我自己。我怀疑这不是所有*,但这是必需的。 – 2013-05-07 16:56:46

+0

@JonSkeet这当然是可能的,但是这是我们唯一知道*给出的代码是错误的。 – Servy 2013-05-07 16:58:11

+0

我想说,添加到他正在搜索的相同'ArrayList'几乎是*知道*是错误的,不是吗? (如果有任何匹配,它会导致异常...) – 2013-05-07 16:59:56

0

您正在将Person对象转换为字符串。您可能希望查看Person对象中的元素以查找要与之比较的数据。

1

编辑:嗯,你看在ArrayList

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

这是永远不会进入ArrayList的身体。我怀疑你的意思是这样的:

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

此外,即使你做了一些值翻阅,这是完全可能的,Convert.ToString(a)不会返回被搜索到的值。除非您的Person课程覆盖ToString(),否则您只会获得课程名称。它更可能是你真正想要的东西,如:

if (a.FirstName == searchString) 

(或者是其他的Person财产实际上你要搜索)

然后,您目前正在增加,你是同ArrayList寻找 - 这不是你想要的。你可能想要类似于:

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

我也建议使用泛型集合,理想情况下是LINQ。例如,LINQ整个代码可以转换为这样的事:

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

在开始foreach循环之前,您需要用值填充personarraylist。 像这样应该更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

所需的操作可以在相当简单和有效的方式使用常规的阵列(string[])代替ArrayList完成。该解决方案概述如下:

  1. 阅读整个文件作为一个字符串,并将其分配给string _tmp VAR(使用任何对象/你所熟悉的方法,例如System.IO.StreamReader

  2. 应用Split()方法从_tmp得到string[]数组:

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

  3. 填充ListBox1从该阵列_ arrPerson基于已使用的ListBox1Items.Add()方法中指定的搜索条件:

    对(INT I = 0;我< _arrPerson.Length;我++){ 如果 (_arrPerson [I]。载(searchString的)){ListBox1.Items.Add(_arrPerson [I]);}}

此代码段应比所有运行得更快的变型市利用ing ArrayList

希望这会有所帮助。 我最好的,AB

PS:看MSDN link的详细信息,String.Split()方法