我的电脑老师要我编写代码来连接两个字符串(以一种奇怪的方式)。代码应该是这样的,如果两个字符串的长度相等,那么输出应该是(string1 + string2)。否则输出应该是长度更大的字符串。挑战是我不应该使用if else
语句或condition?exp1:exp2
。这是我能够提出的(a和b是输入字符串的名称):
int aLen = a.Length;
int bLen = b.Length;
//+1 is added to lengths to prevent divide by zero
int bGreatFlag = ((aLen+1) % (bLen + 1)) / (aLen + 1); //1 if aLen < bLen; 0 Otherwise
int aGreatFlag = ((bLen+1) % (aLen+1)) / (bLen+1); //1 if bLen < aLen; 0 Otherwise
string result = (a + b).Substring((bGreatFlag) * aLen,(aLen + bLen)-(bGreatFlag*aLen)-(aGreatFlag*bLen));
我相信还有另一种方法可以解决这个问题,我完全没有这个问题(一个内置函数或一些LINQ可能吗?)。任何其他方法或正确方向的任何指针有条件地连接字符串将是非常有帮助的。谢谢 :) 。如果答案非常简单,请善待。
答案 0 :(得分:3)
由于您被允许使用LINQ,这是一个可能的解决方案:
但是你的字符串进入一个集合,按字符串的长度对它进行分组,按字符串的长度对结果进行排序,然后使用最长字符串的组。从现在开始,您拥有两个字符串(如果长度相等)或较长字符串的集合,请使用String.Join
创建此集合的字符串。
剧透(不要错过自己实施此项目的乐趣):
var result = String.Join(“”,new [] {a,b} .GroupBy(x =&gt; x.Length).OrderByDescending(x =&gt; x.Key).First()。ToArray( ));
答案 1 :(得分:0)
您可以使用Math.Sign确定哪个长度更大。希望这会有所帮助...
string a, b, result;
switch (Math.Sign(a.Length - b.Length))
{
case 1: result = a; break;
case -1: result = b; break;
default: result = a + b; break;
}
答案 2 :(得分:0)
尝试使用像这样的
string r = "bla", rr = "blabla";
while (rr.Length > r.Length)
{
MessageBox.Show("it works");
break;
}
其中r和rr是两个字符串的一个例子,当它进入中断时,它只能运行一次,所以它就像if ...
答案 3 :(得分:0)
因为我喜欢你这样做的方式,所以我对你进行了一些改进:
string a = "strin";
string b = "string";
string combined = (a + b);
int aLength = a.Length;
int bLength = b.Length;
int aCheck = (aLength % bLength) / aLength;
int bCheck = (bLength % aLength) / bLength;
// If aCheck and bCheck are both 0 (same length) it isn't going to add any characters from the substring as
// aLength * 0 = 0. If either aCheck or bCheck is 1 then it will add the length from aLength again to the string.
string result = combined += combined.Substring(0, (aLength * (aCheck + bCheck)));
result += combined.Substring(0, (bLength * bCheck)); ;
答案 4 :(得分:0)
根据其他人的评论,您的老师并未排除所有可能的分支,例如:您可以使用while
并在一个循环后中断。 switch
是我的最爱,使用CompareTo()
将输出范围缩小到-1, 0 and 1
:
switch ((s1.Length - s2.Length).CompareTo(0))
{
case -1: // s1 less than s2
return s2;
case 1: // s1 greater than s2
return s1;
case 0: // equal length
return s1 + s2;
}