我有一系列列表
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))
}
}
}
以上代码将在以下条件下失败
var output = input.SelectMany(l => l)
.GroupBy(t => t.Name, (name, e) => new testClass { Name = name, Count = e.Sum(x => x.Count) })
.ToList();
这可以使用 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));