我有这两个类:
public class Message
{
string Message;
string Code;
}
public class MessageInitializer
{
DataSet ds;
DataRow dr;
message[] ms;
}
我想在MessageInitializer
中创建一个像这样的构造函数:
MessageInitializer()
{
this.ms = new Message[ds.Tables[0].Rows.Count];
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms[(string)dr.ItemArray[0]] = (string)dr.ItemArray[1];
}
}
但是数组的索引必须是int
类型。我不知道如何解决这个问题:
ms[(string)dr.ItemArray[0]] = (string)dr.ItemArray[1];
更新:
代码格式是这样的字符串:[001-001-001]
,所以我无法将其转换为整数。
答案 0 :(得分:5)
您不再需要Message类了。使用如下字典解决了问题:
public class MessageInitializer
{
DataSet ds;
DataRow dr;
Dictionary<string, string> ms;
public MessageInitializer()
{
this.ms = new Dictionary<string,string>(ds.Tables[0].Rows.Count);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms[(string)dr.ItemArray[0]] = (string)dr.ItemArray[1];
}
}
}
我希望这会有所帮助。
答案 1 :(得分:3)
我认为您只想构建来自ds.Tables[0]
代码 -
ms[i].Code = (string)dr.ItemArray[0];
消息 -
ms[i].Message = (string)dr.ItemArray[1];
MessageInitializer()
{
this.ms = new Message[ds.Tables[0].Rows.Count];
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms[i].Code= (string)dr.ItemArray[0];
ms[i].Message = (string)dr.ItemArray[1];
}
}
为了获得更好的性能,请使用Parallel.ForEach -
Parallel.ForEach(ds.Tables[0].AsEnumerable(), row => {
ms[i].Code= (string)row.ItemArray[0];
ms[i].Message = (string)row.ItemArray[1];
});
答案 2 :(得分:3)
如果您只想获取数据库中所有消息的列表,则可以使用以下代码。请注意,List
代替Array
。更易于使用和更快。
public class Message
{
string Message;
string Code;
}
public class MessageInitializer
{
DataSet ds;
DataRow dr;
List<Message> ms;
MessageInitializer()
{
this.ms = new List<Message>();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms.Add(new Message
{
Code = dr.ItemArray[0].ToString(),
Message = dr.ItemArray[1].ToString(),
});
}
}
}
你提到你有几百万条记录。如果您想要异步访问项目,List
将正常运行。如果您想以非顺序方式访问项目,建议您改用Dictionary
(以提高搜索性能):
public class MessageInitializer
{
DataSet ds;
DataRow dr;
Dictionary<string, Message> ms;
MessageInitializer()
{
this.ms = new Dictionary<string, Message>();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms.Add(dr.ItemArray[0].ToString(), new Message
{
Code = dr.ItemArray[0].ToString(),
Message = dr.ItemArray[1].ToString(),
});
}
}
}
您可以按如下方式访问消息:
var message = ms["001-001-001"];
比访问随机List
项目更快或更快:
var message - ms.First(x => x.Code == "001-001-001");
答案 3 :(得分:1)
我认为你想要执行的是以下内容:
public class Message
{
public string message { get; set; }
public string code { get; set; }
}
public class MessageInitializer
{
DataSet ds;
DataRow dr;
Message[] ms;
MessageInitializer()
{
this.ms = new Message[ds.Tables[0].Rows.Count];
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = ds.Tables[0].Rows[i];
ms[i] = new Message
{
code = (string)dr.ItemArray[0],
message = (string)dr.ItemArray[1]
};
}
}
}