如何查找特定值数组列表

本文关键字:数组 列表 何查找 查找 | 更新日期: 2023-09-27 17:57:50

我有一个数组列表:

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

我的阵列列表像这个

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

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

我是如何做到这一点的?

如何查找特定值数组列表

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

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

如果您正在搜索值类型,则可以使用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;
    }
}

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

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

如果你知道物品会一直在那里,只要使用Single,如果它只在那里一次。

不要使用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;