在列表数组中查找公共元素

问题描述 投票:0回答:2

我有一系列列表

List<testClass>[] input

我想从中创建输出列表

List<testClass>

TestClass
有两个字段 - string
Name
和 int
count

为了创建这个输出列表,我想将数组中

testClass
的每个元素与其他元素进行比较,如果
Name
相同,我想添加它们的计数并插入到输出列表中。所有其他剩余的独特
testClass
将在最后加入输出。

伪代码 例如:-

List<TestClass> L1 = [{"Google",2} ,{"Bing",7},{"Facebook",4},{"Instagram",10}]
List<TestClass> L2 = [{"Google",5} ,{"yahoo",1},{"Facebook",6},{"youtube",23}]
List<TestCLass> L3 = [{"youtube",12}]

//Input
List<TestClass> input[] = [L1,L2,L3]

//Output
List<TestClass> output = [{"Google",7},{"Bing",7},{"Facebook",10},{"Instagram",10},{"yahoo",1},{"youtube",35}]

我能想到的解决方案只有当数组大小固定或者只有当需要比较两个列表时才有可能。

forEach(testClass e in L1)
{
   forEach(testClass f in L2)
   {
      if(e.Name == f.Name)
      {
        output. Add(new testClass (e.name,e.count+f.count))
      }
    }
}

以上代码将在以下条件下失败

  1. 数组有超过 2 个列表
  2. 输出列表不会有值不匹配的 testClass 对象
c# .net list
2个回答
0
投票
var output = input.SelectMany(l => l)
    .GroupBy(t => t.Name, (name, e) => new testClass { Name = name, Count = e.Sum(x => x.Count) })
    .ToList();

0
投票

这可以使用 Linq 轻松完成。
您使用 SelectMany 方法将数组展平为项目集合,使用 GroupBy 方法按属性(在我们的示例中为名称)对集合的项目进行分组,然后只需 Select 您需要的来自分组集合的名称,以及分组值的总和。

public class TestClass
{
    public string Name { get; set; }

    public int Value { get; set; }

    public TestClass(string name, int val)
    {
        Name = name;
        Value = val;
    }
}

List<TestClass> L1 = new List<TestClass>{ new TestClass("Google",2), new TestClass("Bing",7), new TestClass("Facebook",4),new TestClass("Instagram",10)};
List<TestClass> L2 = new List<TestClass>{ new TestClass("Google",5), new TestClass("yahoo",1) ,new TestClass("Facebook",6),new TestClass("youtube",23)};
List<TestClass> L3 = new List<TestClass>{ new TestClass("youtube",12)};

List<TestClass>[] input = new List<TestClass>[]{L1,L2,L3};

var output = input.SelectMany(arr => arr).GroupBy(item => item.Name).Select(grp => new TestClass(grp.Key, grp.Sum(item => item.Value))).ToList();

Console.WriteLine(JsonConvert.SerializeObject(output));     

这是一个.netFiddle

© www.soinside.com 2019 - 2024. All rights reserved.