以交替顺序操作字符串

时间:2016-06-17 13:29:19

标签: c# string linq

我有一个字符串

string value = "123456789";

现在我需要按以下方式重新排列字符串:

123456789
1       right 
12      left 
312     right 
3124    left 
53124   right 
...
975312468 result

是否有一个花哨的linq one liner解决方案来解决这个问题?

我目前的(工作但不太好看)解决方案:

string items = "abcdefgij";
string result = string.Empty;
for (int i = 0; i < items.Length; i++)
{
    if (i % 2 != 0)
    {
        result = result + items[i];
    }
    else
    {
        result = items[i] + result;
    }
}

3 个答案:

答案 0 :(得分:8)

string value = "123456789";
bool b = true;
string result = value.Aggregate(string.Empty, (s, c) =>
{
    b = !b;
    return b ? (s + c) : (c + s);
});    

我实际上不喜欢LINQ语句中的局部变量,但在这种情况下b有助于交替方向。 (@klappvisor展示了如何在没有b的情况下生活。)

答案 1 :(得分:4)

您可以使用FTP_BINARY的长度作为变量来决定要追加哪一侧

res

替代解决方案是使用范围拉伸

items.Aggregate(string.Empty, (res, c) => res.Length % 2 == 0 ? c + res : res + c);

编辑:确实不需要items.Zip(Enumerable.Range(0, items.Length), (c, i) => new {C = c, I = i}) .Aggregate(string.Empty, (res, x) => x.I % 2 == 0 ? x.C + res : res + x.C) ...

答案 2 :(得分:3)

结果字符串是以相反顺序连接到赔率位置的字符的均衡位置中的字符:

string value = "123456789";

var evens = value.Where((c, i) => i % 2 == 1);
var odds = value.Where((c, i) => i % 2 == 0).Reverse();

var chars = odds.Concat(evens).ToArray();
var result = new string(chars);