我需要将我的字符串拆分为2,每个变量一个字母。
示例:string =“ABCDEFGHIJ” name1:ACEGI name2:BDFHJ
我到目前为止:
var builderM = new StringBuilder();
var builderK = new StringBuilder();
for (int i = 0; i < s.Length; i++)
{
builderM.Append(s[i]);
builderK.Append(s[i++]);
}
txtM.Text = builderM.ToString();
txtK.Text = builderK.ToString();
但它在2中显示相同的文字。
答案 0 :(得分:1)
您应该使用++i
代替i++
for (int i = 0; i < s.Length; i++)
{
builderM.Append(s[i]);
if(i + 1 < s.Length) // to prevent IOR exception when count is odd.
builderK.Append(s[++i]); // pre increment.
}
原因是i++
后递增。这意味着i
表达式s[i++]
会在s[i]
表达相同的项目之后递增{.1}}。
答案 1 :(得分:1)
另一种方法是使用LINQ将奇数和偶数索引过滤成两个字符串,如:
var even = new string(input.Where((c, idx) => idx % 2 == 0).ToArray());
var odd = new string(input.Where((c, idx) => idx % 2 != 0).ToArray());
答案 2 :(得分:1)
您还可以使用模运算符(%
)来确定索引是偶数还是奇数,并将偶数索引放在第一个数组中,将奇数索引放在第二个数组中:
for (int i = 0; i < s.Length; i++)
{
if (i % 2 == 0) builderM.Append(s[i]);
else builderK.Append(s[i]);
}
如果您希望增加i
正文中的for
,则必须对s.Length
重复检查(正如我们在for
条件中所做的那样)。此外,您需要将后增量移动到上一行(以便i
及时递增),或使用预增量:
// Move post-increment to previous line example:
for (int i = 0; i < s.Length; i++)
{
builderM.Append(s[i++]);
if (i < s.Length) builderK.Append(s[i]);
}
// Use a pre-increment example:
for (int i = 0; i < s.Length; i++)
{
builderM.Append(s[i]);
if (++i < s.Length) builderK.Append(s[i]);
}
答案 3 :(得分:1)
如果性能不是问题,可以使用LINQ:
var name1 = String.Join(String.Empty, str.Where((v, i) => i % 2 == 0));
var name2 = String.Join(String.Empty, str.Where((v, i) => i % 2 == 1));