具有自定义索引的对象数组

Moh*_*mad 5 c#

我有这两个类:

public class Message
{
    string Message;
    string Code;
}

public class MessageInitializer
{
    DataSet ds;
    DataRow dr;
    message[] ms;
}
Run Code Online (Sandbox Code Playgroud)

我想像这样创建一个构造函数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];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是数组的索引必须是int类型.我不知道如何解决这个问题:

ms[(string)dr.ItemArray[0]] = (string)dr.ItemArray[1];
Run Code Online (Sandbox Code Playgroud)

更新:

代码格式是这样的字符串:[001-001-001],所以我无法将其转换为整数.

Moh*_*ara 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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助.


Nik*_*dze 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(),
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您提到您有几百万条记录。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(),
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式访问消息:

var message = ms["001-001-001"];
Run Code Online (Sandbox Code Playgroud)

它将比访问随机List项目快几个数量级:

var message - ms.First(x => x.Code == "001-001-001");
Run Code Online (Sandbox Code Playgroud)