如何找到特定价值的arraylist

时间:2013-02-06 11:18:25

标签: c# asp.net .net

我有一个数组列表:

public ArrayList GetExpenseTypes()
{
    ArrayList expArry = new ArrayList();

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        string sql = "SELECT ID, TITLE";
        sql += " FROM EXPENSE_TYPE";
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataReader reader;
        try
        {
            conn.Open();
            reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                expArry.Add(new ListItem(reader["TITLE"].ToString(), reader["ID"].ToString()));
            }
            reader.Close();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            conn.Close();
        }
    }
    return expArry;
}

My ArrayList就是这样

1 name1
  2名2   3名3   4名4   5 name6

如果我的值是4,我需要显示name4

我是如何实现这一目标的?

4 个答案:

答案 0 :(得分:1)

而不是ArrayList,您可能希望像这样使用Dictionary<string,string>

public IDictionary<string,string> GetExpenseTypes()
{
    Dictionary<string,string> expArry = new Dictionary<string,string>();

    // Your sql code

    while (reader.Read())
    {
        expArry.Add(reader["TITLE"].ToString(), reader["ID"].ToString());
    }

    // The rest of your code
}

然后你可以得到像这样的值

var values = GetExpenseTypes();
string valueYouWant = values["4"];

另一方面,如果您的问题是当您在Web控件中使用ListItems时看到错误的值,那么您需要在创建ListItem时交换参数,因为第一个参数是显示的文本,第二个参数是值。像这样。

expArry.Add(new ListItem(reader["ID"].ToString(), reader["TITLE"].ToString()));

在这种情况下,您应该考虑使用List<ListItem>代替ArrayList

答案 1 :(得分:0)

我建议先将ArrayList更改为List<ListItem>。如果由于某种原因你不能这样做,你可以使用(假设每个项目都是唯一的):

var x = expArry.Cast<ListItem>().SingleOrDefault(exp => exp.Value == value);
if (x != null)
    //item was found

如果您知道该项目将始终存在,只需使用Single,如果只有一次。

答案 2 :(得分:0)

不要使用ArrayList,使用通用字典执行此类操作

public IDictionary<int, string> GetExpenseTypes()
{
    var result = new Dictionary<int, string>();

    using (var conn = new SqlConnection(connStr))
    {
        var getExpenses = new SqlCommand(
            "SELECT ID, TITLE FROM EXPENSE_TYPE",
            conn);

            conn.Open();
            using (var reader = command.ExecureReader())
            {
                while (reader.Read())
                {
                    result.Add(reader.GetInt32(0), reader.GetString(1));
                }
            }
    }

    return result;
}

然后你可以像这样查找你的字符串

var type4 = GetExpenseTypes()[4];

或者,不要让整个列表找到一个值。

public string GetExpenseType(int id)
{

    using (var conn = new SqlConnection(connStr))
    {
        var getExpenseType = new SqlCommand(
            "SELECT TITLE FROM EXPENSE_TYPE WHERE ID = @p0",
            conn);

        getExpenseType.Parameters.Add(id);

        conn.Open();
        return (string)getExpenseType.ExecuteScalar();
    }
}

如果由于某种不好的原因,您希望坚持使用ArrayList返回功能,则可以找到这样的项目。

var expenseTypes = GetExpenseTypes().OfType<ListItem>().ToDictionary(
    li => int.Parse(li.Text),
    li => li.Value);

var type4 = expenseTypes[4];

或者,如果你想这样做一次。

var type4 = GetExpenseTypes().OfType<ListItem>()
                .Single(li => li.Text == "4").Value;

答案 3 :(得分:0)

如果要搜索值类型,可以使用BinarySearch方法;在你的情况下,这似乎不可能。

我认为您可能需要使用一个循环,假设您不能使用Linq(因为使用了框架);

int index = -1;
for(int i=0; i<expArray.Count;i++)
{
    ListItem temp = (expArray[i] as ListItem);
    if(temp != null && temp.Value == "some value")
    {
        index = i;
        break;
    }
}