【问题标题】:Add numbers per unique names in a list在列表中为每个唯一名称添加数字
【发布时间】:2021-02-12 08:24:43
【问题描述】:

我正在尝试从两个列表输入中为每个唯一名称添加数字,如下例所示,使用 C#。

Inputs
numbers: 1, 2, 3, 4, 5
names: A, B, A, B, C

我试图作为输出的两个列表是:

Outputs
uniqueNames: A, B, C
numbersPerName: 4(1+3), 6(2+4), 5

我可以从列表中获取唯一名称,但是如何在下面的代码之后为每个唯一名称添加数字?

HashSet<string> nameSet = new HashSet<string>();
for (int i = 0; i < names.Count; i++){
      nameSet.Add(names[i]);
    }
uniqueNames = nameSet;

提前感谢您的帮助!

【问题讨论】:

  • 这些是单独的列表吗?与具有属性namenumber 的对象列表相反?
  • 是的,输入是两个单独的列表。我想让代码动态化,以便输出列表中的项目随着输入列表中唯一名称的增长而增长。
  • 这能回答你的问题吗? Getting unique items from a list

标签: c#


【解决方案1】:

这里的技巧是Zip 两个列表(假设它们的长度总是相同)然后使用GroupBySum

var names = new []{"A","B","A","B","C"};
var numbers = new []{1,2,3,4,5};
    
var combined = names.Zip(numbers, (name,number) => new{ Name = name, Number = number});
    
var result = combined.GroupBy(x => x.Name)
                     .Select(g => new {Name=g.Key, Value = g.Sum(x => x.Number)});
    
foreach(var item in result)
{
    Console.WriteLine($"{item.Name}: {item.Value}");
}

现场示例:https://dotnetfiddle.net/6iHRR4

如果你想要返回 2 个单独的列表,你可以这样做:

var uniqueNames = result.Select(x => x.Name);
var numbersPerName = result.Select(x => x.Value);

【讨论】:

  • 非常感谢!这是我的第一篇文章,我很惊讶我得到答案的速度如此之快。
猜你喜欢
  • 1970-01-01
  • 2019-04-05
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2014-12-23
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多