我有一个数组列表:
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
我是如何实现这一目标的?
答案 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;
}
}