我做了很多挖掘,似乎无法找到这个特定问题的答案;类似问题的答案,但没有这样的。
基本上,我要做的是拿两个C#列表,它们都包含一系列由字符串 - 整数对组成的C#对象,然后将它们合并在一起,加入类似对象的值。
假设我的Object Class看起来像这样;
public class Object
{
public string Name;
public int Value;
}
我们也会说我的列表看起来像这样;
objectList1 objectList2
Name Value Name Value
Object1 1 Object1 1
Object2 1 Object2 1
Object3 1
Object4 1
Object5 1
我的目标是将objectList2
的对象的内容组合到objectList1
中的相应对象。在这个例子中,这意味着objectList1
在完成所有操作时看起来像这样;
Name Value
Object1 2
Object2 2
Object3 1
Object4 1
Object5 1
现在我知道这可以用foreach
和FindIndex()
来电,但我几乎肯定有一个更有效的方法来解决这个问题。如果我错了,那很好,但我想知道我是否可以优化它,因为我的直觉告诉我必须有一个更简单的方法。
答案 0 :(得分:1)
我相信你要做的事情:
var contents = sample.Concat(example).GroupBy(n => n.Name);
基本上它会创建一个分组,但它会将列表附加在一起。然后根据名称进行分组,该名称将提供存在多少相同名称的数字指示符。基本上,您最终得到IGrouping<Key, Value>
。
例如:
var merge = new List<Content>();
var contents = sample.Concat(example).GroupBy(n => n.Name);
foreach(var item in contents)
merge.Add(new Content() { Name = item.Key, Value = item.Sum(value => value.Value) });
如果你愿意的话,你也可以和所有Linq一起做:
var contents = example.Concat(sample)
.GroupBy(n => n.Name)
.SelectMany(content =>
content.Select((item, i) => new { Name = content.Key, Value = content.Sum(v => v.Value) }).Distinct());
答案 1 :(得分:1)
我能想到的最好的选择是使用Dictionary,假设所有键都是唯一的
在较小的词典上做一个foreach(下面没有显示),检查另一个词中的匹配键,然后修改如果找不到或添加如果没找到(注意这个算法是破坏性的,如果你想要复制则返回保留原件)
void Merge (Dictionary<string, int> a, Dictionary<string, int> b)
{
foreach (string key in a.Keys)
{
if (b.ContainsKey(key))
{
b[key] = b[key] + a[key];
}
else
{
b.Add(key, a[key]);
}
}
}
答案 2 :(得分:1)
您可以使用以下LINQ
var list1 = new List<Object>();
list1.Add(new Object { Name = "Object1", Value = 1 });
list1.Add(new Object { Name = "Object2", Value = 1 });
list1.Add(new Object { Name = "Object3", Value = 1 });
list1.Add(new Object { Name = "Object4", Value = 1 });
list1.Add(new Object { Name = "Object5", Value = 1 });
var list2 = new List<Object>();
list2.Add(new Object { Name = "Object1", Value = 1 });
list2.Add(new Object { Name = "Object2", Value = 1 });
var total = from item1 in list1
join item2 in list2
on item1.Name equals item2.Name into list3
from subset in list3.DefaultIfEmpty()
select new Object
{
Name = item1.Name,
Value = item1.Value + (subset == null ? 0 : subset.Value)
};