如何在包装类中创建关联数组
本文关键字:创建 关联 数组 包装类 | 更新日期: 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);