【问题标题】:Join two Lists<strings> to create a List of KeyValuePair [duplicate]加入两个 Lists<strings> 以创建 KeyValuePair 列表 [重复]
【发布时间】:2020-08-25 04:04:45
【问题描述】:

我有List&lt;KeyValuePair&lt;string,string&gt;&gt;的列表

var results = new List <KeyValuePair<string, string>>();

我还有两个字符串列表:

var position= new List<string>{ "first", "second", "third" };
 
var name = new List<string>{ "John", "Diana", "Matthew", "Lisa", "James"};

这两个列表的大小可以不同,只需添加一个空字符串即可。

我想将它们合并在一起以创建一个新的results。我目前正在使用这个:

 results = position.Zip(name, (x, y) => new KeyValuePair<string, string>(x, y)).ToList(); 

如果只有两个列表的大小相同,这将起作用。但是,如果不是,它会修剪 name 列表以匹配 position 列表。所以不是所有的值都存在。

我需要做到以下几点

first,John
second,Diana
third, Matthew
     , Lisa
     , Jame

这两个列表在任何时候都可以是可变大小的,而不是固定的。所以有时name 可以大于position,反之亦然。

我看到有人使用了SelectMany,但不确定如何将它与我的Zip 结合使用。 有什么想法或建议吗?

【问题讨论】:

  • 当你说“这两个列表可以有不同的大小”时,可以比position长或只是name长?
  • 是的,这是正确的,两个列表在任何时候都可以是可变大小的。不固定。所以有时name 可以大于position,反之亦然。

标签: c#


【解决方案1】:

我会增加名称列表的长度以匹配位置元素的数量,并根据需要添加空字符串。

position.Zip(name.Concat(Enumerable.Repeat(string.Empty, Math.Max(0, position.Count - name.Count))), (x, y) => ...

【讨论】:

  • 在减法中会有-1的结果吗?如果是这样会影响吗?因为这两个列表的大小都可以变化,所以它们不是固定的。
【解决方案2】:

有很多方法可以做到这一点。例如,一个 DIY 单班轮将是:

var position = // positions here
var name = // names here

var results = name
    .Select((n, nIdx) => new KeyValuePair(nIdx >= position.Length ? null : position[nIdx], n))
    .Concat(position.Skip(name.Length).Select(p => new KeyValuePair(p, (string)null))))
    .ToList(); 

已编辑以允许任一列表更大。

【讨论】:

  • 这不是假设name 的元素比position 多吗?
  • 还是同一个号码,是的。
  • OP 证实我怀疑position 也可以比name 拥有更多元素
  • 轻松处理,相应地编辑了我的答案!
  • @Blindy KeyValuePair 存在问题(它需要两个参数)。编译器对此不满意?
猜你喜欢
  • 1970-01-01
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多