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

本文关键字:对象 数组 索引 自定义 | 更新日期: 2023-09-27 18:04:37

我有两个类:

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],所以我不能把它转换成整数。

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

您不再需要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];
        }
    }
}

如果您只想从数据库中获得所有消息的列表,那么您可以使用下面的代码。注意,是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");

我想你只是想从ds.Tables[0]建立一个消息数组

Code -
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。
Parallel.ForEach(ds.Tables[0].AsEnumerable(), row => {
        ms[i].Code= (string)row.ItemArray[0];
        ms[i].Message = (string)row.ItemArray[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]
            };
        }
    }
}