1

我有一个数组列表:

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;
}

我的 ArrayList 像这样

1 名称1
2 名称2
3 名称3
4名称4
5名称6

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

我如何做到这一点?

4

4 回答 4

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"];

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

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

在这种情况下,您应该考虑使用 aList<ListItem>而不是ArrayList

于 2013-02-06T11:43:00.183 回答
1

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;
    }
}
于 2013-02-06T12:13:46.643 回答
0

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

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

如果您知道该项目将始终存在,则只需使用Single它仅存在一次即可。

于 2013-02-06T11:27:39.170 回答
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;
于 2013-02-06T12:01:42.670 回答