合并 2 个数字字符串或者每第 N 个位置

Merge 2 Numeric strings Alternatively every Nth place

我有 2 个带逗号的数字字符串:

8,1,6,3,16,9,14,11,24,17,22,19 和 2,7,4,5,10,15,12,13,18,23,20,21

我需要每隔第 N 个地方合并它们 (例如每第 4 名获得)

8,1,2,7,6,3,4,5,16,9,10,15,14,11,12,13,24,17,18,23,22,19,20 ,21

我已经检查了所有推荐的解决方案,但没有一个对我有用。

这是我目前的进度:

string result = "";

// For every index in the strings
for (int i = 0; i < JoinedWithComma1.Length || i < JoinedWithComma2.Length; i=i+2)
{
    // First choose the ith character of the
    // first string if it exists
    if (i < JoinedWithComma1.Length)
        result += JoinedWithComma1[i];

    // Then choose the ith character of the
    // second string if it exists
    if (i < JoinedWithComma2.Length)
        result += JoinedWithComma2[i];
}

感谢任何帮助。

您不能依赖字符串的长度或 select“第 ith 个字符”,因为并非所有“元素”(阅读:数字)都具有相同数量的字符。您应该拆分字符串,以便您可以从结果数组中获取元素:

string JoinedWithComma1 = "8,1,6,3,16,9,14,11,24,17,22,19";
string JoinedWithComma2 = "2,7,4,5,10,15,12,13,18,23,20,21";

var split1 = JoinedWithComma1.Split(',');
var split2 = JoinedWithComma2.Split(',');

if (split1.Length != split2.Length)
{
    // TODO: decide what you want to happen when the two strings
    //       have a different number of "elements".
    throw new Exception("Oops!");
}

然后,您可以轻松地编写一个 for 循环来合并两个列表:

var merged = new List<string>();
for (int i = 0; i < split1.Length; i += 2)
{
    if (i + 1 < split1.Length)
    {
        merged.AddRange(new[] { split1[i], split1[i + 1],
                                split2[i], split2[i + 1] });
    }
    else
    {
        merged.AddRange(new[] { split1[i], split2[i] });
    }
}

string result = string.Join(",", merged);
Console.WriteLine(
    result);      // 8,1,2,7,6,3,4,5,16,9,10,15,14,11,12,13,24,17,18,23,22,19,20,21

Try it online.

如果你写一个正则表达式来得到一对数字:

var r = new Regex(@"\d+,\d+");

您可以将每个字符串分成一对序列:

var s1pairs = r.Matches(s1).Cast<Match>().Select(m => m.ToString());
var s2pairs = r.Matches(s2).Cast<Match>().Select(m => m.ToString());

你可以压缩序列

var zipped = s1pairs.Zip(s2pairs,(a,b)=>a+","+b);

并用逗号将位连接在一起

var result = string.Join(",", zipped);

它是如何工作的?

正则表达式匹配任意数量的数字,后跟一个逗号,然后是任意数量的数字

一串

1,2,3,4,5,6

匹配3次:

1,2
3,4
5,6

Matches returns 包含所有这些匹配项的 MatchCollection。要与 LINQ Select 兼容,您需要 Cast MatchCollectionIEnumerable<Match>。之所以这样,是因为 MatchCollection 早于 IEnumerable<T> 的发明,因此需要转换的是枚举器 returns object。一旦变成 IEnumerable<Match>,每个匹配项都可以被 Select 变成 ToString,生成一个字符串序列,这些字符串是由逗号分隔的数字对组成的。 s1pairs 实际上是数字对的集合:

new []{ "1,2", "3,4", "5,6" }

对字符串 2 重复同样的操作

压缩序列。正如你从名字中想象的那样,Zip 从 A 中取出一个,然后从 B 中取出一个,然后从 A 中取出一个,然后从 B 中取出一个,将它们像衣服上的拉链一样合并,所以两个序列

new [] { "1,2", "3,4" }

new [] { "A,B", "C,D" }

当压缩结束时

new [] { "1,2,A,B", "3,4,C,D" }

剩下的就是用逗号将它重新连接起来

"1,2,A,B,3,4,C,D"