合并两个列表并组合对象值

时间:2016-11-10 00:24:40

标签: c# list merge

我做了很多挖掘,似乎无法找到这个特定问题的答案;类似问题的答案,但没有这样的。

基本上,我要做的是拿两个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

现在我知道这可以用foreachFindIndex()来电,但我几乎肯定有一个更有效的方法来解决这个问题。如果我错了,那很好,但我想知道我是否可以优化它,因为我的直觉告诉我必须有一个更简单的方法。

3 个答案:

答案 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)
            };
相关问题