C# 具有自定义索引的对象数组
我有两门课:C# 具有自定义索引的对象数组,c#,C#,我有两门课: public class Message { string Message; string Code; } public class MessageInitializer { DataSet ds; DataRow dr; message[] ms; } 我想在MessageInitializer中创建一个构造函数,如下所示: MessageInitializer() { this.ms = new Message[ds.Tabl
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];
}
}
更新:
代码格式是这样的字符串:
[001-001-001]
,因此我无法将其转换为整数。我想您只需要从ds.Tables[0]
代码-ms[i].code=(字符串)dr.ItemArray[0]代码>
消息-
ms[i].Message=(字符串)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];
}
}
如果您只想从数据库中获取所有消息的列表,那么可以使用下面的代码。注意,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(),
});
}
}
}
您可以按如下方式访问消息:
var message = ms["001-001-001"];
它将比访问随机列表
项快几个数量级:
var message - ms.First(x => x.Code == "001-001-001");
我认为你想要做的是:
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]
};
}
}
}
公共类消息
{
公共字符串消息{get;set;}
公共字符串代码{get;set;}
}
公共类消息初始值设定项
{
数据集ds;
数据行dr;
消息[]ms;
MessageInitializer()
{
this.ms=新消息[ds.Tables[0].Rows.Count];
对于(int i=0;i
您不再需要消息类。使用以下词典可以解决此问题:
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];
}
}
}
公共类消息初始值设定项
{
数据集ds;
数据行dr;
字典ms;
公共消息初始值设定项()
{
this.ms=新字典(ds.Tables[0].Rows.Count);
对于(int i=0;i
我希望这会有帮助。试试Integer.parseInt(dr.ItemArray[0])
听起来像是在找一个。dr.ItemArray[0]
是代码,dr.ItemArray[1]
是消息?你在dr.ItemArray[0]
中有什么字符串<代码>{001-001-001]
?你为什么要使用Array
而不是Dictionary
?目前我的类的工作方式与此完全相同。为了访问类中的消息,我有一个foreach,因为其中有数百万条消息,它的工作速度非常慢。所以我决定更改类。@Dan你真的必须加载数百万条消息吗内存中数据库中的邮件?@AseemGautam.yes。目前查找邮件大约需要800毫秒,我希望我能更快。@NikolaiSamteladze。不幸的是,是的。我必须这样做。@Dan您以后是否会处理这些邮件?如果是,您可能希望分批处理(比如每个10000)不要在内存中保留这么大的结构。非常感谢。现在如何使用代码访问单个消息?我必须使用循环。对吗?你确定吗?当我尝试ms[“001-001-001”]出现此错误:错误2参数1:无法从'string'转换为'int'。我的错误。我正在考虑一个字典
。使用列表
可以先执行ms(x=>x.code==“001-001-001”)
。非常感谢。我对字典很感兴趣。似乎这正是我想要的。请编辑您的帖子并在其中提及字典,以便我可以标记为答案。是的,添加了一个使用字典的示例。Dan,要通过代码查找单个消息,您可以使用:var myMessage=ms.SingleOrDefault(item=>item.code==someCode);这样会更容易。除非他以后想通过添加新属性来扩展消息
。我的朋友,这是对的。在这种情况下,使用列表是解决方案。但是正如您上面所说,字典的性能要好得多。
var message - ms.First(x => x.Code == "001-001-001");
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]
};
}
}
}
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];
}
}
}