【问题标题】:Retrieve object from an arraylist with a specific element value从具有特定元素值的数组列表中检索对象
【发布时间】:2013-10-28 11:52:07
【问题描述】:

我有一个具有一些属性的类。例如以姓名、年龄、性别等为属性的类人。

人们填写了一个表格,其中包括他们的性别,这是一个下拉列表,他们提交它,然后这个人被添加到数组列表中。

我需要的是一个功能,通过点击一个按钮来显示所有选择女性作为性别的人。

有人可以帮帮我吗?我已经尝试并寻找正确的答案好几天了,现在有点绝望了。

非常感谢!!!

奥拉夫

这是我的 .cs 代码

    public class Person
{
    private string name;
    private string artistname;
    private string address;
    private double number;
    private double zip;
    private string day;
    private string gender;

public Person(string name, string artistname, string address, double number, double zip, string day, string gender)
    {
        this.name = name;
        this.artistname = artistname;
        this.address = address;
        this.number = number;
        this.zip = zip;
        this.day = day;
        this.gender = gender;
    }

    public override string ToString()
    {
        string newPerson = name + " aka " + artistname + " lives on " + address + " " + number + " " + zip + " " + day + "Gender: " + gender;
        return newPerson;
    }
}

这是我的 .aspx 代码:

public partial class Index : System.Web.UI.Page
{
    static ArrayList personArrayList;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            personArrayList = new ArrayList();
        }
    }

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Person p = new Person(txtName.Text, txtArtistName.Text, txtAddress.Text, Convert.ToDouble(txtNumber.Text), Convert.ToDouble(txtPostal.Text), Convert.ToString(dropdownDay.Text), Convert.ToString(dropdownGender.Text));
        personArrayList.Add(p);
    }

    protected void btnShowAll_Click(object sender, EventArgs e)
    {
        ListBoxShow.Items.Clear();
        for (int i = 0; i < personArrayList.Count; i++)
        {
            ListBoxShow.Items.Add(personArrayList[i].ToString());
        }
    }

    protected void btnShowGentle_Click(object sender, EventArgs e)
    {
        ListBoxShow.Items.Clear();

    }

    protected void btnShowLadies_Click(object sender, EventArgs e)
    {
        ListBoxShow.Items.Clear();
        for (int i = 0; i < personArrayList.Count; i++)
        {
            if (personArrayList[i].gender = "Female")
            {

            }
        }
    }
}

【问题讨论】:

  • 为什么不使用 SQLite 之类的东西,这样您就可以使用内置的数据库功能来为您执行此操作?
  • 请检查答案或向我们添加更多帮助

标签: c# asp.net .net class oop


【解决方案1】:

C#的方式是使用LINQ来查询集合,如下:

var persons = personArrayList.AsQueryable();
var females = persons.Where(p => p.gender.Equals("Female"));

【讨论】:

  • 我知道这不起作用,因为这是一个 ArrayList 而不是 List 但我想知道你能像我使用它一样将完整的查询翻译成这种格式吗? "从 personArrayList 中的 Person P 中 P.Gender == "Female" select P;"
  • 在您的情况下,我的编译器无法找出 p 是什么类型。所以它永远无法到达 p.gender ...可能是因为我在这里使用 .net 3.5 吗?
  • 你需要输入你的数组列表:personArrayList = new ArrayList();
  • 是的,但从源代码来看,它是一个普通的数组列表......这就是为什么我问如何在你的系统中指定 p 的类型......我知道它对于 IL 但我不完全了解您的系统
  • 好的。当然,您可以选择在您的方法中转换集合,但我看不出有任何理由在初始化时不输入它。我在 Mac atm 上,所以无法尝试,但您可以尝试在 lambda 中转换 p: Where((Person)p => p.gender.Equals("Female"))
【解决方案2】:

我认为这样的事情应该可以解决问题

using System.Linq;
var females = from Person P in personArrayList where P.Gender == "Female" select P;

[编辑] 我自己对此有一些疑问,所以问了一个问题Plain ArrayList Linq c# 2 syntaxes (need a conversion),这可能对你有用。

【讨论】:

    【解决方案3】:

    你会感谢这样的话吗?

    protected void btnShowGentle_Click(object sender, EventArgs e)
    {
        ListBoxShow.Items.Clear();
        for (int i = 0; i < personArrayList.Count; i++)
        {
            if(personArrayList[i].gender == "Male")
                ListBoxShow.Items.Add(personArrayList[i].ToString());
        }
    }
    
    ////Possible alternate
    //ListBoxShow.Items.Clear();
    //ListBoxShow.Items.AddRange(personArrayList.Where( x => x.gender == "Male"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多