如何在C#中的列表内合并字符串

时间:2019-01-02 19:05:02

标签: c# .net

我有一个字符串列表,其中提供了有关几天内工作的信息,例如“ 0111110”表示一周的第一天和最后一天不提供旅行。

现在有一个包含信息的列表,例如 “ 0111110”, “ 1000001”

因此整个区块的营业日为“ 1111111”。

我的问题是如何有效合并行程以获取大块运行时间?

5 个答案:

答案 0 :(得分:5)

您可以使用| Operator(按位或):

var x1 = Convert.ToByte("0111110", 2);
var x2 = Convert.ToByte("1000001", 2);

var foo = x1 | x2;

var bar = Convert.ToString(foo, 2);

答案 1 :(得分:1)

您可以使用Zip使用一些简单的逻辑来组合字符串。

    var combined= input1.Zip
        (
            input2, 
            (a,b) => a == '1' ? a : b
        ); 

这为您提供了可枚举的字符,您可以使用String的构造函数将其转换为新的字符串。

var output = new string(combined.ToArray());

完整示例:

public static void Main()
{
    var input1 = "1110000";
    var input2 = "0001110";
    var combined = input1.Zip
        (
            input2, 
            (a,b) => a == '1' ? a : b
        ); 

    var result = new string(combined.ToArray());

    Console.WriteLine(result);
}

输出:

1111110

Example on DotNetFiddle

答案 2 :(得分:0)

具有嵌套循环:

string[] strs = new string[] { "0111110", "1000001" };

char[] main = strs[0].ToCharArray();



for(int i = 0; i < 7; i++)
{
    if(main[i] == '1')
        continue;
    for(int j = 1; j < strs.Length; j++)
    {
        if(strs[j][i] == '1')
        {
            main[i] = '1';
            break;
        }
    }
}

string result = new string(main);

比kristoffer的按位比较罗word,但如果要合并大量字符串,它应该很快,因为一旦在特定位置上使1消失,它就会放弃。按位或方法有点天真,并且会导致更多不必要的转换。哪个表现更好,可能取决于您所处的情况。按位方法也可能存在一些填充/长度问题,如果使用字节,则限制为8位。您只有7天的时间,但有人可能会将其升级为一天完整的一个月。这种方法在这方面没有局限性

“ N个字符串”按位方法:

byte r = 0;
for(int i = 0; i < strs.Length && r != 127; i++)
  r |= Convert.ToByte(strs[i], 2);

string res = Convert.ToString(t, 2).PadLeft(7, '0');

如果达到127,我们可以提早止损,因为这表明达到1111111。前导零将丢失,必须使用PadLeft进行恢复

答案 3 :(得分:0)

假设您不能使用与提供的字符串不同的类型,则可以将结果复制到数组中并从中创建字符串:

var result = new char[7];
for (int i=0; i<7; i++)
    if (s1[i] == '1' || s2 == ['1'])
        result[i] = '1';

var finalResult = new string(result);

这是有效的,因为您只有两个分配(数组和字符串),七个迭代/比较和最多七个char副本。

答案 4 :(得分:0)

    public static class OperationalBlockCalculator
    {
        public static string GetOperationalBlock(List<string> workingDays)
        {
            var operationalBlock = new StringBuilder("0000000");
            for (var day = 0; day < 7; day++)
            {
                if (workingDays.Any(x => x.ElementAt(day).Equals('1')))
                {
                    operationalBlock[day] = '1';
                }
            }
            return operationalBlock.ToString();
        }
    }

    [TestFixture]
    public class WhenIMergeTripWorkingDays
    {
        [Test]
        public void ThenItShouldReturnOperationalBlock()
        {
            var workingDays = new List<string> { "0110110", "1000001" };
            OperationalBlockCalculator.GetOperationalBlock(workingDays).Should().Be("1110111");
        }
    }