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

时间:2015-07-26 04:26:34

标签: c#

我有这两个类:

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],所以我无法将其转换为整数。

4 个答案:

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