如何在包装类

时间:2016-01-11 10:01:49

标签: c#

我已经像这样建立了一个数组关联,我知道如何从索引为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}},
        }
    }
}

但是我得到了错误结果,之后我想尝试显示一个index = 10的整数值,但是我得到了一个错误。

3 个答案:

答案 0 :(得分:0)

在您的datacontainer类中,您有一个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)
                {

                }
            }

答案 1 :(得分:0)

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

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

现在你可以使用这段代码循环:

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

答案 2 :(得分:-1)

如果您希望我有一个带索引器的复杂解决方案。这是:

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));

通过这种方式,你的课很复杂,但是获取和设置很简单。 如果您想了解有关索引器的更多信息,请link

要先提取总和,您可以这样做:

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

或者:

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