【问题标题】:merging two lists with similar key and concat values or concat values from single list合并具有相似键和连接值或来自单个列表的连接值的两个列表
【发布时间】:2018-01-28 14:57:49
【问题描述】:

我有两个字符串列表,它们可能没有相同的键和值 列表1

(0) = {[Str1, J44]}
(1) = {[Str2, J45]}
(2) = {[Str3, J46]}

列表2

(0) = {[Str1, J47]}
(1) = {[Str2, J48]}
(2) = {[Str3, J49]}
(3) = {[Str4, J50]}

我想将它们连接或合并为 合并列表

(0) = {[Str1, =J44+J47]}
(1) = {[Str2, =J45+J48]}
(2) = {[Str3, =J46+J49]}
(3) = {[Str4, =J50]}

第二个选项 我可以将所有这些都放在一个列表中作为 List1 (0) = {[Str1, J44]} (1) = {[Str2, J45]} (2) = {[Str3, J46]} (3) = {[Str1, J47]} (4) = {[Str2, J48]} (5) = {[Str3, J49]} (6) = {[Str4, J50]}

我需要和上面一样的结果。为此,我到目前为止已经完成了第二个选项

Dim MergePavStr = (From kvps In List1 Group kvps By kvps.Key Into Group Select New KeyValuePair(Of String, String)(Key, Group.Concat(Function(kvp) kvp.Value))).ToList()

但我找不到正确的连接方式。

更新已解决 我通过执行以下代码实现了它。希望这也是解决方案,因为我对 vb.net 很陌生

Dim MergePavStr = (From kvps In List1 Group kvps By kvps.Key Into Group Select New KeyValuePair(Of String, String)(Key, String.Join("+", Group.Select(Function(p) p.Value).ToArray()))).ToList()

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    您可以在分组前将键值对列表(或字典)与.Concat 组合起来:

    Dim result = List1.Concat(List2).GroupBy(Function(p) p.Key, Function(p) p.Value).
                                ToDictionary(Function(g) g.Key, Function(g) String.Concat(g))
    

    【讨论】:

      【解决方案2】:

      我不清楚您使用的是什么数据结构。您是否考虑过以简单的方式进行操作?

      Module Module1
      
          Sub MergeInto(dest As Dictionary(Of String, List(Of String)), src As Dictionary(Of String, String))
              For Each kvp In src
                  If dest.ContainsKey(kvp.Key) Then
                      dest(kvp.Key).Add(kvp.Value)
                  Else
                      dest.Add(kvp.Key, New List(Of String) From {kvp.Value})
                  End If
              Next
          End Sub
      
          Sub Main()
              Dim x As New Dictionary(Of String, String) From {{"Str1", "J44"}, {"Str2", "J45"}, {"Str3", "J46"}}
              Dim y As New Dictionary(Of String, String) From {{"Str1", "J47"}, {"Str2", "J48"}, {"Str3", "J49"}, {"Str4", "J50"}}
              Dim z As New Dictionary(Of String, List(Of String))
      
              MergeInto(z, x)
              MergeInto(z, y)
      
              Dim i = 0
              For Each kvp In z
                  Console.WriteLine($"({i}) = {{[{kvp.Key}, ={String.Join("+", kvp.Value)}]}}")
                  i += 1
              Next
      
              Console.ReadLine()
      
          End Sub
      
      End Module
      

      输出:

      (0) = {[Str1, =J44+J47]}
      (1) = {[Str2, =J45+J48]}
      (2) = {[Str3, =J46+J49]}
      (3) = {[Str4, =J50]}

      作为扩展方法当然会更整洁,需要一个更好的名字,留给读者练习吧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        相关资源
        最近更新 更多