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