如何在包装类中创建关联数组

本文关键字:创建 关联 数组 包装类 | 更新日期: 2023-09-27 18:29:44

我已经创建了这样一个关联数组,并且我知道如何从索引为10的dict中获取值

var dict = new Dictionary<int, Dictionary<string, int[]>>
    {
        {
            10, new Dictionary<string, int[]>
            {
                {"first", new[] {57, 57, 5, 0}},
                {"second", new[] {42, 58, 13, 8}}
            }
        },
        {
            40, new Dictionary<string, int[]>
            {
                {"first", new[] {4, 24, 5, 0}},
                {"second", new[] {42, 58, 23, 8}}
            }
        }
    };
foreach (var item in dict[10])
{
    foreach (var test in item.Value)
    {
        Console.WriteLine(test);   //This will show value with key 10                 
    }
};

之后,我想通过将dict封装在类中来更改此代码,使我的代码更加优雅和可维护

一流

class DataContainer
{  
    public DataContainer() {}
    public int index { get; set; }
    public DataValue DataValue { get; set; }
}

二级

class DataValue
{
    public DataValue()
    { 
        IntegerValues = new List<int>();
    }
    public string name { get; set; }
    public List<int> IntegerValues { get; set; }
}

在那之后,我想像在dict字典中插入的那样填充我的数据,但我混淆了如何制作它。我已经尝试过下面的代码。

public List<DataContainer> harakatSininilMabsutoh = new List<DataContainer>(){
    new DataContainer{index = 10 , DataValue = new List<DataValue>()
        {
            new DataValue{name = "first", IntegerValues = {9,55,18,11}},
            new DataValue{name = "second", IntegerValues = {5,54,18,11}},
        }
    }
}

但在那之后我得到了错误的结果,我想尝试显示一个索引为10的整数,但我得到了一个错误。

如何在包装类中创建关联数组

在数据容器类中,您有一个Datavalue属性。而不是列表。

class DataContainer
{  
    public DataContainer() {}
    public int index { get; set; }
    public DataValue DataValue { get; set; } //<-- only one Datavalue
}

但在下方的代码中

public List<DataContainer> harakatSininilMabsutoh = new List<DataContainer>(){ 
    new DataContainer{index = 10 , DataValue = new List<DataValue>()
        {// ***DataValue is not a list****
            new DataValue{name = "first", IntegerValues = {9,55,18,11}},
            new DataValue{name = "second", IntegerValues = {5,54,18,11}},
        }
    }
}

当您新建datacontainer时,您正在将dataVlue设置为List。如果以上是您想要做的,请将DataContainer类更改为

class DataContainer
{  
    public DataContainer() { DataValue = new List<DataValue>();}
    public int index { get; set; }
    public List<DataValue> DataValue { get; set; }
}

现在你可以做了

var conatainer10 = harakatSininilMabsutoh.FirstOrDefault(container => container.index == 10);
           // if you want to loop
            foreach (var dataContainer in harakatSininilMabsutoh)
            {
                foreach (var dataValue in dataContainer.DataValue)
                {
                }
            }

您使用harakatSininilMabsutoh [10]了吗?如果是这样的话,那么引发错误是正常的,你没有在类中定义索引,为了获得你的dataContainer,你使用以下代码:

var data = DataContainer.FirstOrDefault(d=>d.Index == 10);

现在您可以使用以下代码进行循环:

foreach(intVal in data.IntegerValues)
{
// do whatever you want
}

如果需要,我有一个带索引器的复杂解决方案。这是:

public class DataContainer
{
    private Dictionary<int, DataValue> _dataValues = new Dictionary<int, DataValue>();
    public DataValue this[int i] {
        get { return _dataValues[i]; }
        set { _dataValues[i] = value; }
    }
    public List<int> this[string i] {
        get {
            List<List<int>> l = new List<List<int>>();
            foreach (DataValue dv in _dataValues.Values) {
                try {
                    l.Add(dv[i]);
                }
                catch { }
            }
            return GetSum(l);
        }
    }
    public void Add(int index, DataValue val)
    {
        if (_dataValues.ContainsKey(index)) {
            _dataValues[index].Add(val);
        }
        else {
            _dataValues.Add(index, val);
        }
    }
    public List<int> GetSum(string index, params int[] indexes)
    {
        List<List<int>> l = new List<List<int>>();
        foreach (int i in indexes) {
            DataValue dv = this[i];
            try {
                l.Add(dv[index]);
            }
            catch { }
        }
        return GetSum(l);
    }
    private List<int> GetSum(List<List<int>> l)
    {
        if (l.Count > 0) {
            List<int> result = new List<int>();
            for (int j = 0; j < l.Count; j++) {
                for (int z = 0; z < l.FirstOrDefault().Count; z++) {
                    if (j == 0) {
                        result.Add(l[j][z]);
                    }
                    else {
                        result[z] += l[j][z];
                    }
                }
            }
            return result;
        }
        return null;
    }
}
public class DataValue
{
    private Dictionary<string, List<int>> _integerValues = new Dictionary<string, List<int>>();
    private string _name { get; set; }
    private List<int> _vals { get; set; }
    public List<int> this[string i] {
        get { return _integerValues[i]; }
        set { _integerValues[i] = value; }
    }
    public DataValue(string name, params int[] val)
    {
        _name = name;
        _vals = val.ToList();
        _integerValues.Add(_name, _vals);
    }
    public void Add(string index, List<int> val)
    {
        _integerValues.Add(index, val);
    }
    public void Add(string index, params int[] val)
    {
        _integerValues.Add(index, val.ToList());
    }
    public void Add(DataValue dataValue)
    {
        _integerValues.Add(dataValue._name, dataValue._vals);
    }
}

以下是如何创建集合:

DataContainer dc = new DataContainer();
dc.Add(10, new DataValue("first", 9, 55, 18, 11));
dc.Add(40, new DataValue("first", 9, 55, 18, 11));
dc.Add(10, new DataValue("second", 5, 54, 18, 11));

获取数据:

List<int> intValues = dc[10]["first"];

如果DataContainer已经存在,则添加DataValue:

cd[10].Add("third", 1, 2, 3, 4);
cd[10].Add("fourth", new List<int>(){ 1, 2, 3, 4 });
cd[10].Add(new DataValue("fifth", 9, 55, 18, 11));

这样,你的类很复杂,但是get和set很简单。如果你想了解更多关于索引器的信息,这是一个链接。

要提取的总和,首先你可以这样做:

List<int> vals = cd["first"];

或者:

List<int> vals = cd.GetSum("first", 10, 40);