按条件将两个字符串合并为一个字符串并保持顺序

时间:2017-01-12 12:43:31

标签: c# string algorithm

我有两个返回以下字符串的方法: 第一种方法返回:

"Subj1
Subj3
Subj5
Subj7"

第二种方法返回:

"Subj1 (1)
Subj5 (6)
Subj4 (2)
Subj2 (8)"

如何合并这些以得到这样的结果:

"Subj1 (1)
Subj3
Subj5 (6)
Subj7
Subj4 (2)
Subj2 (8)"

我是否需要更改方法的签名,以便这些方法以其他形式或其他形式返回结果?

合并逻辑:如果第一个字符串中的项目存在于第二个字符串中,则将第二个字符串中的项目放入结果字符串中,如果第一个字符串中的项目不存在于第二个字符串中,则将第一个字符串中的项目放入结果字符串

3 个答案:

答案 0 :(得分:2)

如果我理解你的逻辑,你需要两个步骤。

步骤1,在换行符上拆分字符串:

var s1 = "Subj1
Subj3
Subj5
Subj7"
var s2 = "Subj1 (1)
Subj5 (6)
Subj4 (2)
Subj2 (8)"
var s1words = split(s1, NewLine)
var s2words = split(s2, NewLine)

步骤2,在s2words中找到s1words中的每个单词,如果存在,则使用它:

var res
for each (word w in s1words) {
    for each (word x in s2words) {
        if (x.starts_with(w))
            res += x + NewLine
        else
            res += w + NewLine

效率不高,但很简单。

答案 1 :(得分:1)

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication42
{
    class Program
    {
        static void Main(string[] args)
        {
            string input1 = 
                "Subj1\n" +
                "Subj3\n" +
                "Subj5\n" +
                "Subj7\n";
            string input2 =

                 "Subj1 (1)\n" +
                 "Subj5 (6)\n" +
                 "Subj4 (2)\n" +
                 "Subj2 (8)\n";

            string[] stringArray= (input1 + input2).Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);
            var groups = stringArray.GroupBy(x => x.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[0]);
            string output = string.Join("\n", groups.Select(x => x.OrderByDescending(y => y.Length).FirstOrDefault()));
        }
    }
}

答案 2 :(得分:1)

您可以将它们合并为列表,然后分组,并为每个组获取一个后缀:

var a1 = s1.Split(sep, StringSplitOptions.None);
var a2 = s2.Split(sep, StringSplitOptions.None);
var u = a1.Concat(a2);
var s = u.GroupBy(x => x.Split(' ')[0])
         .Select(y => y.OrderByDescending(z => z.Length).FirstOrDefault())
         .ToList();
String.Join("\r\n", s)