Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在对象列表中添加字典的2个值_C#_.net_Linq_List_Dictionary - Fatal编程技术网

C# 如何在对象列表中添加字典的2个值

C# 如何在对象列表中添加字典的2个值,c#,.net,linq,list,dictionary,C#,.net,Linq,List,Dictionary,我有一门课是这样的: class item { public int Id { get; set; } public Dictionary<string, int> Data { get; set; } } 类项目 { 公共int Id{get;set;} 公共字典数据{get;set;} } 我有两个列表,包含像这样的类对象: item obj1 = new item(); obj1.Id = 1; obj1.Data = new Dictionary<s

我有一门课是这样的:

class item
{
    public int Id { get; set; }
    public Dictionary<string, int> Data { get; set; }
}
类项目
{
公共int Id{get;set;}
公共字典数据{get;set;}
}
我有两个列表,包含像这样的类对象:

item obj1 = new item();
obj1.Id = 1;
obj1.Data = new Dictionary<string, int>();
obj1.Data.Add("1", 11);
obj1.Data.Add("2", 12);
obj1.Data.Add("3", 13);

item obj2 = new item();
obj2.Id = 2;
obj2.Data = new Dictionary<string, int>();
obj2.Data.Add("1", 21);
obj2.Data.Add("2", 22);
obj2.Data.Add("3", 23);

item obj3 = new item();
obj3.Id = 3;
obj3.Data = new Dictionary<string, int>();
obj3.Data.Add("1", 31);
obj3.Data.Add("2", 32);
obj3.Data.Add("3", 33);

item obj4 = new item();
obj4.Id = 1;
obj4.Data = new Dictionary<string, int>();
obj4.Data.Add("1", 41);
obj4.Data.Add("2", 42);
obj4.Data.Add("3", 43);

item obj5 = new item();
obj5.Id = 2;
obj5.Data = new Dictionary<string, int>();
obj5.Data.Add("1", 51);
obj5.Data.Add("2", 52);
obj5.Data.Add("3", 53);

item obj6 = new item();
obj6.Id = 3;
obj6.Data = new Dictionary<string, int>();
obj6.Data.Add("1", 61);
obj6.Data.Add("2", 62);
obj6.Data.Add("3", 63);

List<item> lst1 = new List<item>();
lst1.Add(obj1);
lst1.Add(obj2);
lst1.Add(obj3);

List<item> lst2 = new List<item>();
lst2.Add(obj4);
lst2.Add(obj5);
lst2.Add(obj6);
List<item> result = new List<item>();
result[0].Id = 1
result[0].Data["1"] = 52  // obj1.Data[1] + obj4.Data[1]
result[0].Data["2"] = 54  // obj1.Data[2] + obj4.Data[2]
result[0].Data["3"] = 56  // obj1.Data[3] + obj4.Data[3]

result[1].Id = 2
result[1].Data["1"] = 72  // obj2.Data[1] + obj5.Data[1]
result[1].Data["2"] = 74  // obj2.Data[2] + obj5.Data[2]
result[1].Data["3"] = 76  // obj2.Data[3] + obj5.Data[3]

result[2].Id = 3
result[2].Data["1"] = 92  // obj3.Data[1] + obj6.Data[1]
result[2].Data["2"] = 94  // obj3.Data[2] + obj6.Data[2]
result[2].Data["3"] = 96  // obj3.Data[3] + obj6.Data[3]
item obj1=新项();
obj1.Id=1;
obj1.Data=新字典();
obj1.数据添加(“1”,11);
obj1.数据添加(“2”,12);
obj1.数据添加(“3”,13);
项目obj2=新项目();
obj2.Id=2;
obj2.Data=newdictionary();
obj2.数据添加(“1”,21);
obj2.数据添加(“2”,22);
obj2.数据添加(“3”,23);
项目obj3=新项目();
obj3.Id=3;
obj3.Data=新字典();
obj3.数据添加(“1”,31);
obj3.数据添加(“2”,32);
obj3.数据添加(“3”,33);
项目obj4=新项目();
obj4.Id=1;
obj4.Data=新字典();
obj4.数据添加(“1”,41);
obj4.数据添加(“2”,42);
obj4.数据添加(“3”,43);
项目obj5=新项目();
obj5.Id=2;
obj5.Data=新字典();
obj5.数据添加(“1”,51);
obj5.数据添加(“2”,52);
obj5.数据添加(“3”,53);
项目obj6=新项目();
obj6.Id=3;
obj6.Data=新字典();
obj6.数据添加(“1”,61);
obj6.数据添加(“2”,62);
obj6.数据添加(“3”,63);
List lst1=新列表();
lst1.添加(obj1);
lst1.添加(obj2);
lst1.添加(obj3);
List lst2=新列表();
lst2.添加(obj4);
lst2.添加(obj5);
lst2.添加(obj6);
现在,我想根据对象的id和dictionary键添加dictionary的值。结果如下:

item obj1 = new item();
obj1.Id = 1;
obj1.Data = new Dictionary<string, int>();
obj1.Data.Add("1", 11);
obj1.Data.Add("2", 12);
obj1.Data.Add("3", 13);

item obj2 = new item();
obj2.Id = 2;
obj2.Data = new Dictionary<string, int>();
obj2.Data.Add("1", 21);
obj2.Data.Add("2", 22);
obj2.Data.Add("3", 23);

item obj3 = new item();
obj3.Id = 3;
obj3.Data = new Dictionary<string, int>();
obj3.Data.Add("1", 31);
obj3.Data.Add("2", 32);
obj3.Data.Add("3", 33);

item obj4 = new item();
obj4.Id = 1;
obj4.Data = new Dictionary<string, int>();
obj4.Data.Add("1", 41);
obj4.Data.Add("2", 42);
obj4.Data.Add("3", 43);

item obj5 = new item();
obj5.Id = 2;
obj5.Data = new Dictionary<string, int>();
obj5.Data.Add("1", 51);
obj5.Data.Add("2", 52);
obj5.Data.Add("3", 53);

item obj6 = new item();
obj6.Id = 3;
obj6.Data = new Dictionary<string, int>();
obj6.Data.Add("1", 61);
obj6.Data.Add("2", 62);
obj6.Data.Add("3", 63);

List<item> lst1 = new List<item>();
lst1.Add(obj1);
lst1.Add(obj2);
lst1.Add(obj3);

List<item> lst2 = new List<item>();
lst2.Add(obj4);
lst2.Add(obj5);
lst2.Add(obj6);
List<item> result = new List<item>();
result[0].Id = 1
result[0].Data["1"] = 52  // obj1.Data[1] + obj4.Data[1]
result[0].Data["2"] = 54  // obj1.Data[2] + obj4.Data[2]
result[0].Data["3"] = 56  // obj1.Data[3] + obj4.Data[3]

result[1].Id = 2
result[1].Data["1"] = 72  // obj2.Data[1] + obj5.Data[1]
result[1].Data["2"] = 74  // obj2.Data[2] + obj5.Data[2]
result[1].Data["3"] = 76  // obj2.Data[3] + obj5.Data[3]

result[2].Id = 3
result[2].Data["1"] = 92  // obj3.Data[1] + obj6.Data[1]
result[2].Data["2"] = 94  // obj3.Data[2] + obj6.Data[2]
result[2].Data["3"] = 96  // obj3.Data[3] + obj6.Data[3]
列表结果=新列表();
结果[0]。Id=1
结果[0]。数据[“1”]=52//obj1.Data[1]+obj4.Data[1]
结果[0]。数据[“2”]=54//obj1.Data[2]+obj4.Data[2]
结果[0]。数据[“3”]=56//obj1.Data[3]+obj4.Data[3]
结果[1]。Id=2
结果[1]。数据[“1”]=72//obj2.Data[1]+obj5.Data[1]
结果[1]。数据[“2”]=74//obj2.Data[2]+obj5.Data[2]
结果[1]。数据[“3”]=76//obj2.Data[3]+obj5.Data[3]
结果[2]。Id=3
结果[2]。数据[“1”]=92//obj3.Data[1]+obj6.Data[1]
结果[2]。数据[“2”]=94//obj3.Data[2]+obj6.Data[2]
结果[2]。数据[“3”]=96//obj3.Data[3]+obj6.Data[3]
获得此结果的最佳方法是什么


谢谢

首先,您作为示例显示的输出是错误的。例如,
obj3.Data[1]+obj6.Data[1]
等于92,而不是56

所以,这就是林克的所有美丽之处:

var result = lst1.Join(lst2, x => x.Id, y => y.Id, (x, y) => new item
             {
                Id = x.Id,
                Data = x.Data.Join(y.Data, 
                                   a => a.Key,
                                   b => b.Key, 
                                   (a, b) => new { a.Key, Value = a.Value + b.Value }).ToDictionary(r => r.Key, t => t.Value)
             }).ToList();
如您所愿,结果是:

result[0].Id = 1
result[0].Data["1"] = 52  // obj1.Data[1] + obj4.Data[1]
result[0].Data["2"] = 54  // obj1.Data[2] + obj4.Data[2]
result[0].Data["3"] = 56  // obj1.Data[3] + obj4.Data[3]

result[1].Id = 2
result[1].Data["1"] = 72  // obj2.Data[1] + obj5.Data[1]
result[1].Data["2"] = 74  // obj2.Data[2] + obj5.Data[2]
result[1].Data["3"] = 76  // obj2.Data[3] + obj5.Data[3]

result[2].Id = 3
result[2].Data["1"] = 92  // obj3.Data[1] + obj6.Data[1]
result[2].Data["2"] = 94  // obj3.Data[2] + obj6.Data[2]
result[2].Data["3"] = 96  // obj3.Data[3] + obj6.Data[3]

这里有一个更长的方法,但它确实允许您使用单个函数轻松添加多个项目列表,并且可能更容易理解/调试,具体取决于您对Linq的掌握程度:

private static List<Item> AddItemLists(List<List<Item>> itemLists)
{
    if (itemLists == null) throw new ArgumentNullException("itemLists");

    var result = new List<Item>();

    foreach (var itemList in itemLists)
    {
        foreach (var item in itemList)
        {
            var existingItemWithId = result.FirstOrDefault(i => i.Id == item.Id);

            if (existingItemWithId == null)
            {
                result.Add(item);
            }
            else
            {
                foreach (var itemData in item.Data)
                {
                    if (existingItemWithId.Data.ContainsKey(itemData.Key))
                    {
                        existingItemWithId.Data[itemData.Key] += itemData.Value;
                    }
                    else
                    {
                        existingItemWithId.Data.Add(itemData.Key, itemData.Value);
                    }
                }
            }
        }
    }

    return result;
}
private静态列表addItemList(列表项列表)
{
如果(itemLists==null)抛出新的ArgumentNullException(“itemLists”);
var result=新列表();
foreach(itemLists中的var itemList)
{
foreach(itemList中的变量项)
{
var existingItemWithId=result.FirstOrDefault(i=>i.Id==item.Id);
if(existingItemWithId==null)
{
结果.添加(项目);
}
其他的
{
foreach(item.Data中的var itemData)
{
if(existingItemWithId.Data.ContainsKey(itemData.Key))
{
existingItemWithId.Data[itemData.Key]+=itemData.Value;
}
其他的
{
existingItemWithId.Data.Add(itemData.Key、itemData.Value);
}
}
}
}
}
返回结果;
}
用法示例:

var obj1 = new Item {Id = 1, Data = 
    new Dictionary<string, int> {{"1", 11}, {"2", 12}, {"3", 13}}};
var obj2 = new Item {Id = 2, Data = 
    new Dictionary<string, int> {{"1", 21}, {"2", 22}, {"3", 23}}};
var obj3 = new Item {Id = 3, Data = 
    new Dictionary<string, int> {{"1", 31}, {"2", 32}, {"3", 33}}};
var obj4 = new Item {Id = 1, Data = 
    new Dictionary<string, int> {{"1", 41}, {"2", 42}, {"3", 43}}};
var obj5 = new Item {Id = 2, Data = 
    new Dictionary<string, int> {{"1", 51}, {"2", 52}, {"3", 53}}};
var obj6 = new Item {Id = 3, Data = 
    new Dictionary<string, int> {{"1", 61}, {"2", 62}, {"3", 63}}};

// Three lists of items that we want to 'add'
var lst1 = new List<Item> {obj1, obj2};
var lst2 = new List<Item> {obj3, obj4};
var lst3 = new List<Item> {obj5, obj6};

// Add up as many lists of items that you want
var result = AddItemLists(new List<List<Item>> {lst1, lst2, lst3});
var obj1=新项目{Id=1,数据=
新词典{“1”,11},{“2”,12},{“3”,13};
var obj2=新项{Id=2,数据=
新词典{“1”,21},{“2”,22},{“3”,23};
var obj3=新项{Id=3,数据=
新词典{“1”,31},{“2”,32},{“3”,33};
var obj4=新项{Id=1,数据=
新词典{“1”,41},{“2”,42},{“3”,43};
var obj5=新项{Id=2,数据=
新词典{“1”,51},{“2”,52},{“3”,53};
var obj6=新项{Id=3,数据=
新词典{“1”,61},{“2”,62},{“3”,63};
//我们要“添加”的三个项目列表
var lst1=新列表{obj1,obj2};
var lst2=新列表{obj3,obj4};
var lst3=新列表{obj5,obj6};
//把你想要的项目列表加起来
var result=AddItemLists(新列表{lst1,lst2,lst3});
结果如下:


你的结果肯定是错的。。。提示:太多的
[0]
我完全同意@DrKoch。例如,obj3.Data[1]+obj6.Data[1]等于92,而不是56.ups。。是的,这是错误的。。我的错:p。更新。@farhadJabiyev谢谢farhad。。。这就是我要找的。。。(y)