所以,我有两个字符串,每个字符串的最大长度为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。换句话说,我需要两个字符串中的一些文本。
答案 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)