如何将 Linq.IEnumerable(Of String) 转换为格式化字符串
How to convert Linq.IEnumerable(Of String) to formatted Strings
我有一个 List(Of String)
存储验证错误。如果该列表包含任何项目,我想将它们连接成一个 HTML 列表以显示每个错误。目前这很容易做到:
Dim l As List(Of String) = GetErrors()
If l.Count > 0 Then
Dim sb As New StringBuilder
sb.Append("<div><ul>")
For Each s As String In l
sb.Append(String.Format("<li>{0}</li>", s))
Next
sb.Append("</ul></div>")
ltl_status.Text = sb.ToString()
End If
不过,由于篇幅较长,不知Linq能否提供一个捷径。我试过了(为清楚起见添加了换行符):
If l.Count > 0 Then
ltl_status.Text = String.Format("<div class=""failure""><ul>{0}</ul></div>",
(
From s As String In l Select
String.Format("<li>{0}</li>", s)
)
)
End If
但是,鉴于 IEnumerable 是一个集合,最终结果只是文字中的输出:
System.Linq.Enumerable+WhereSelectListIterator`2[System.String,System.String]
此处的目的是使用尽可能少的代码行构建列表。我看到 String.Join
接受一个 IEnumerable 参数,但它只是将项目连接在一起,而在这里我需要在每个项目的开头和结尾添加额外的字符串。可能吗?
回答
根据 Jon Skeet 的出色建议,扩展方法为我节省了 吨 的时间和精力:
Public Module CollectionSignatureMethods
''' <summary>
''' Takes each String value in a String collection, reformats using a format, and then returns all as a single String.
''' </summary>
''' <param name="ie">An IEnumerable(Of String) collection of string values</param>
''' <param name="formatString">The string format (as per String.Format)</param>
''' <returns>All of the Strings from the collection, reformatted and combined to a single String</returns>
''' <remarks>Jon Skeet is the daddy(!)</remarks>
<Extension()> _
Public Function JoinFormat(ie As IEnumerable(Of String), formatString As String) As String
Return String.Join(String.Empty, ie.Select(Function(s As String) String.Format(formatString, s)))
End Function
End Module
听起来您需要 Join
和 Select
的组合:
String.Join("", _
l.Select(Function(s as String) String.Format("<li>{0}</li>", s))
当然,您始终可以编写自己的 JoinFormat
扩展方法 - 这并不难做到,而且可能在任何地方都有用。例如,您可能会:
ltl_status.Text = String.Format("<div class=""failure""><ul>{0}</ul></div>",
l.JoinFormat("<li>{0}</li>"));
我有一个 List(Of String)
存储验证错误。如果该列表包含任何项目,我想将它们连接成一个 HTML 列表以显示每个错误。目前这很容易做到:
Dim l As List(Of String) = GetErrors()
If l.Count > 0 Then
Dim sb As New StringBuilder
sb.Append("<div><ul>")
For Each s As String In l
sb.Append(String.Format("<li>{0}</li>", s))
Next
sb.Append("</ul></div>")
ltl_status.Text = sb.ToString()
End If
不过,由于篇幅较长,不知Linq能否提供一个捷径。我试过了(为清楚起见添加了换行符):
If l.Count > 0 Then
ltl_status.Text = String.Format("<div class=""failure""><ul>{0}</ul></div>",
(
From s As String In l Select
String.Format("<li>{0}</li>", s)
)
)
End If
但是,鉴于 IEnumerable 是一个集合,最终结果只是文字中的输出:
System.Linq.Enumerable+WhereSelectListIterator`2[System.String,System.String]
此处的目的是使用尽可能少的代码行构建列表。我看到 String.Join
接受一个 IEnumerable 参数,但它只是将项目连接在一起,而在这里我需要在每个项目的开头和结尾添加额外的字符串。可能吗?
回答
根据 Jon Skeet 的出色建议,扩展方法为我节省了 吨 的时间和精力:
Public Module CollectionSignatureMethods
''' <summary>
''' Takes each String value in a String collection, reformats using a format, and then returns all as a single String.
''' </summary>
''' <param name="ie">An IEnumerable(Of String) collection of string values</param>
''' <param name="formatString">The string format (as per String.Format)</param>
''' <returns>All of the Strings from the collection, reformatted and combined to a single String</returns>
''' <remarks>Jon Skeet is the daddy(!)</remarks>
<Extension()> _
Public Function JoinFormat(ie As IEnumerable(Of String), formatString As String) As String
Return String.Join(String.Empty, ie.Select(Function(s As String) String.Format(formatString, s)))
End Function
End Module
听起来您需要 Join
和 Select
的组合:
String.Join("", _
l.Select(Function(s as String) String.Format("<li>{0}</li>", s))
当然,您始终可以编写自己的 JoinFormat
扩展方法 - 这并不难做到,而且可能在任何地方都有用。例如,您可能会:
ltl_status.Text = String.Format("<div class=""failure""><ul>{0}</ul></div>",
l.JoinFormat("<li>{0}</li>"));