【问题标题】:Arraylist search string but no outputArraylist 搜索字符串但没有输出
【发布时间】:2013-05-07 16:51:50
【问题描述】:

谁能告诉我,为什么我在 buttonclick 上没有得到任何输出?

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 类在文件中写入和读取(也更新)。但是搜索功能刚刚让我变得更好。 (作为学生,需要在文件中处理数据,否则我会使用数据库)。希望这可以清除我的代码。我是否必须将搜索词与诸如 firstName 之类的东西进行比较,或者它是否可以在整个文件中起作用?

【问题讨论】:

  • 根据您之前的问题,您有静态人员数组以及人员类上的 ToString 方法覆盖,因此您可以尝试ListBox1.DataSource = personarraylist.Where(p => p.ToString().Contains(TextBox1.Text)).ToList();

标签: c# arraylist output string-search


【解决方案1】:

您创建一个新的数组列表,然后立即foreach 覆盖它。由于您刚刚创建它,因此其中没有任何项目,因此 foreach 什么都不做。

【讨论】:

  • 很好发现 - 只有在编辑时才注意到我自己。我怀疑这不是 all 所必需的。
  • @JonSkeet 这当然有可能,但我们唯一可以知道给出的代码有问题。
  • 我会说添加到他正在搜索的同一个ArrayList 几乎已知是错误的,不是吗? (如果有任何匹配会导致异常...)
  • @JonSkeet 这取决于您认为错误是什么。也许错误在于他的意思是 foreach 使用不同的集合,那么这就是需要更改的全部内容。
【解决方案2】:

编辑:嗯,你正在寻找一个 empty 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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      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;
      

      【讨论】:

        【解决方案5】:

        在开始 foreach 循环之前,您需要用值填充 personarraylist。 这样的东西应该更有用:

            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;
        

        【讨论】:

          【解决方案6】:

          可以使用常规数组 (string[]) 而不是 ArrayList,以相当直接有效的方式完成所需的操作。解决方案概述如下:

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

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

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

          3. 根据您使用ListBox1Items.Add() 方法指定的搜索条件,从该数组_arrPerson 填充ListBox1

            for (int i=0;i<_arrperson.length if>

          这段代码 sn-p 应该比使用 ArrayList 的所有变体运行得快得多。

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

          PS:有关 String.Split() 方法的详细信息,请参阅 MSDN link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 2016-01-11
            • 1970-01-01
            • 2012-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多