1

配列リストが 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これは、最初のパラメーターが表示されるテキストであり、2 番目が表示されるテキストであるためです。価値。このような。

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

その場合、List<ListItem>代わりにa を使用することを検討する必要がありますArrayList

于 2013-02-06T11:43:00.183 に答える
1

you could use BinarySearch method if you are searching for value types; in your case this does not seem possible.

I think you may need to use a loop assuming that you can not use Linq (because of the framework employed);

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

ArrayList最初に変更することをお勧めしList<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];

または、1 つの値を見つけるためにリスト全体を取得しないでください。

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 に答える