【问题标题】:Convert Dictionary into structured format string将字典转换为结构化格式字符串
【发布时间】:2012-11-28 16:42:48
【问题描述】:

我有一个 Dictionary 对象声明为var as Dictionary(of String, String)

我正在尝试利用通用集合可用的 LINQ 扩展,但我只获得了非扩展方法。

我需要将 Dictionary 集合转换为具有以下模式的字符串:key1=val1, key2=val2, ..., keyn=valn

一开始我以为做一个 foreach 循环会成功,除了我是程序员块。

到目前为止我有什么,但怀疑它是产生这个的最佳逻辑模式:

Public Overrides Function ToString() As String
    Dim ret As String = ""
    For Each kv As KeyValuePair(Of String, String) In Me._set
        If ret <> String.Empty Then
            ret &= ", "
        End If

        ret &= String.Format("{0}={1}", kv.Key, kv.Value)
    Next

    Return ret
End Function

由于某种原因,即使我已将 System.CoreSystem.Linq 库导入项目,但我的 dev-env 智能感知中没有显示任何扩展的 LINQ 扩展。所以现在,除非有人可以帮助我让 LINQ 扩展显示在 Intellisense 中,否则它们是不可能的。

发现 LINQ 扩展没有显示的问题,所以它们又回到了桌面上 ;)

【问题讨论】:

  • 我会这样写 Linq(对不起 C#-vb.net 汤...) var ret = String.Join(",",Me._set.Select(kvp=>String .Format("{0}={1}",kvp.Key, kvp.Value).ToArray());
  • 把它作为一个答案....我做了足够的 C# 开发来理解它。使用 VB.Net 更舒服。
  • .net 专家似乎更喜欢 vb.net 而不是 C#。他们不会错的。我想我只是涡轮帕斯卡一代,有分号和花括号;-)

标签: vb.net collections .net-4.0 generic-collections


【解决方案1】:

我会像这样用 Linq 编写整个方法块(对不起 C#-vb.net 汤...)

升c

return String.Join(",",Me._set.Select(kvp=>String.Format("{0}={1}",kvp.Key, kvp.Value).ToArray());

另外,我真的不知道 _set 是什么。也许你必须投:

升c:

return String.Join(",", Me._set.Cast<KeyValuePair<String,String>>().Select(kvp=>String.Format("{0}={1}",kvp.Key, kvp.Value).ToArray());

vb.net:

return String.Join(", ", Me.Select(Function(kvp) String.Format("{0}={1}", kvp.Key, kvp.Value)).ToArray())

希望这会有所帮助,

【讨论】:

  • 在我翻译到 VB.Net 后就像一个魅力。等效转换:String.Join(", ", Me.Select(Function(kvp) String.Format("{0}={1}", kvp.Key, kvp.Value).ToArray()))
  • _set 是私有变量,即Dictionary(Of String, String)
  • 更改了它,因此该类从 Dictionary(Of String, STring) 扩展,因为它使对集合的操作更容易。
  • 我在 vb.net 中发现了一个括号错误。应该是return String.Join(", ", Me.Select(Function(kvp) String.Format("{0}={1}", kvp.Key, kvp.Value)).ToArray())
  • 括号错误导致它改为打印为 System.char[]
【解决方案2】:

就您的非 LINQ 循环而言,我建议您这样做:

Public Overrides Function ToString() As String
    Dim items As New List(Of String)(_set.Count)
    For Each pair As KeyValuePair(Of String, String) In _set
        items.Add($"{pair.Key}={pair.Value}"))
    Next
    Return String.Join(", ", items)
End Function

使用 LINQ,您可以这样做:

Public Overrides Function ToString() As String
    Return String.Join(", ", _set.Select(Function(pair) $"{pair.Key}={pair.Value}"))
End Function

【讨论】:

  • 你会用 LINQ 做什么?
  • 我不会 :) 我被困在 VS 2005 中,所以我对它不太熟悉。
  • DOH....我有 3 个版本可用于 2k8、2010 和(客户)2012。在 2k8 出现后立即离开 2k5 用于 SL2/3 开发
  • @jbl ;p~ 在您的总体指导中
  • 好吧,现在我们已经到了 VS 2017,我认为是时候更新我的答案以反映最新技术了。我的回答中的示例现在演示了 LINQ 的使用以及使用插值字符串文字而不是 String.Format
【解决方案3】:

VB.net 语法:

Dim dic As New Dictionary(Of String, String)() From {
            {"a", "1"},
            {"b", "2"},
            {"c", "3"},
            {"d", "4"}
            }

Dim s As String = String.Join(",", dic.Select(Function(pair) String.Format("{0}={1}", pair.Key, pair.Value)).ToArray())

【讨论】:

  • 与上面发布的@jbl 完全相同的代码。请添加到线程中,不要只是在已经建议的内容上添加更明亮的光芒。
  • 当我发布此内容时,jbl 的答案中只有 c# 语法,我很惊讶您认为这值得一票否决,但我可以忍受!
  • @GoldBishop 这不是 SO 的工作方式。人们编辑他们的答案,他们甚至可能并不明显。你会发现多个类似的答案。时差可能很小或没有。在 meta 上,它提到反对意见应该是在 isolarion 中回答的正确性。
  • dic.select 对我不起作用。也许是因为我将其声明为一般object
猜你喜欢
  • 2019-01-08
  • 2021-08-21
  • 2021-06-17
  • 1970-01-01
  • 2018-04-25
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多