我已经像这样建立了一个数组关联,我知道如何从索引为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的整数值,但是我得到了一个错误。
答案 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);