截断2个字符串并组合成较小的字符串

时间:2017-11-28 17:32:36

标签: string vb.net truncate

所以,我有两个字符串,每个字符串的最大长度为100。

 Dim a as String ''has a max length of 100
 Dim b as String ''has a max length of 100

这两个字符串需要被截断并组合成一个新字符串。

 Dim c as String 'has a max length of 100

我需要能够恰当地截断每个字符串,以便我可以将字符串c接近100.我打算用25做一堆语句来截断每个字符串。

 if a.length = 100 and b.length =0 then
     return a
 else if a.length = 100 andalso b.length <= 25 then
     return a.truncate(75) & b
 else if a.length = 100 andalso b.length <= 50 then
     return a.truncate(50) & b
 else if....

所以可以点击所有场景...

我觉得有一种更好的方法可以做到这一点和一种更有效的方式,这样我就不会遇到像a.length = 100和b.length = 51这样的情况。我会截断当时需要的更多字符。

有什么建议吗?请根据需要批评我。

编辑,这是vb.Net ..不是C#(我在项目之间)抱歉!

我不想将它们一起添加并截断它们的原因是因为如果两个字符串的长度都是100,那么它将完全截断第二个字符串。如果它们都是100那么我想要将字符串a截断为50长度并将字符串b截断为50长度,因此当它们组合时它们总共为100。换句话说,我需要两个字符串中的一些文本。

4 个答案:

答案 0 :(得分:2)

如果琴弦的总长度大于极限,那么你可以按照长度的比例选择一小部分:

Module Module1

    Function CombineWithLengthConstraint(a As String, b As String, totalLength As Integer) As String

        ' trivial case 1:
        If totalLength < 1 Then
            Return String.Empty
        End If

        Dim aLen = Len(a)
        Dim bLen = Len(b)

        ' trivial case 2:
        If aLen + bLen <= totalLength Then
            Return a & b
        End If

        ' impossible-to-satisfy-equably case:
        If totalLength = 1 Then
            If aLen > 0 Then
                Return a.Substring(0, 1)
            ElseIf bLen > 0 Then
                Return b.Substring(0, 1)
            Else
                Return String.Empty
            End If
        End If

        ' aportion the lengths of the strings to be taken in the ratio of their lengths:
        Dim aFrac = CInt(Math.Round(aLen / (aLen + bLen) * totalLength, MidpointRounding.AwayFromZero))
        Dim bFrac = CInt(Math.Round(bLen / (aLen + bLen) * totalLength, MidpointRounding.AwayFromZero))

        ' ensure there is at least one character from each string...
        If aFrac = 0 Then
            aFrac = 1
            bFrac -= 1
        End If
        If bFrac = 0 Then
            bFrac = 1
            aFrac -= 1
        End If

        Dim aPart = a.Substring(0, aFrac)
        Dim bPart = b.Substring(0, bFrac)

        Return aPart & bPart

    End Function

    Sub Main()

        Dim a = New String("A"c, 10)
        Dim b = New String("b"c, 40)
        Dim c = CombineWithLengthConstraint(a, b, 10)

        Console.WriteLine(c)
        Console.WriteLine(Len(c))

        Console.ReadLine()

    End Sub

End Module

输出:

  

AAbbbbbbbb
  10

正如你所看到的,第一个字符串是字符总数的1/5,最终贡献了1/5的结果。

如果VB.NET Len函数的参数为​​Nothing,则给出0。

我测试它是因为所有长度从0到100的两个字符串被组合成一个长度为100的字符串,以防我在舍入或任何事情上犯了错误。

当然,如果在特定应用程序中有意义,你可以返回字符串b的结尾部分而不是起始部分。

答案 1 :(得分:1)

虽然不是完全你要求的,但这是另一种选择......

Public Function WeirdConcatinate(a As String, b As String) As String
    Dim totalLen = a.Length + b.Length
    If totalLen > 100 Then
        Dim aLen = 100 * a.Length \ totalLen
        Dim bLen = 100 - aLen
        Return a.Remove(aLen) & b.Remove(bLen)
    Else
        Return a & b
    End If
End Function

这将为每个字符串(大约)提供一些字符,这些字符与它们相互比较的时间成比例。如果两个字符串的长度相同,则每个字符串都会得到50。如果a.Length = 100且b.Length = 50,那么你最终得到66来自a和34来自b。

答案 2 :(得分:0)

连接后截断它们,然后:

Dim c = a & b
If c.Length > 100 Then c = c.Remove(100)

如果你想尽可能多地保留每个字符串的开头:

Dim c = ""
If(a.Length > 50 AndAlso b.Length < 50)
  c = a.Remove(100 - b.Length) & b
Else If a.Length > 50 AndAlso b.Length > 50
  c= a.Remove(50) & b.Remove(50) 
Else 
  c = a & b
End if

If c.Length > 100 Then c = c.Remove(100)

答案 3 :(得分:0)

与其他一些答案一样,该算法可以解释。我的方法从每个字符串中取出,直到取出总共100个字符或字符串用完字符。

Private Function concat(a As String, b As String, length As Integer) As String
    Dim ca As New System.Text.StringBuilder()
    Dim cb As New System.Text.StringBuilder()
    For i As Integer = 0 To length - 1
        ca.Append(If(i >= a.Length, "", a(i)))
        cb.Append(If(i >= b.Length, "", b(i)))
        If ca.Length + cb.Length >= length Then Exit For
    Next
    Return (ca.ToString() & cb.ToString() & New String(" "c, 100)).Substring(0, length)
End Function

Sub Main()
    Dim a As String = New String("a"c, 0)
    Dim b As String = New String("b"c, 5)
    Dim c As String = concat(a, b, 100)
    Console.WriteLine($"'{c}'")
End Sub
  

'bbbbb'

(填充为100个字符,不在块引用中呈现)

Dim a As String = New String("a"c, 30)
Dim b As String = New String("b"c, 90)
  

'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'

Dim a As String = New String("a"c, 72)
Dim b As String = New String("b"c, 64)
  

'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'

(您在评论中的示例.72&gt;&gt;&gt; 50,64&gt;&gt; 50)