Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中联合列表中的字符串_C#_.net - Fatal编程技术网

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

C# 如何在C中联合列表中的字符串,c#,.net,C#,.net,我有一个字符串列表,它提供了以天为单位的旅行信息,例如011110表示旅行在一周的第一天和最后一天不可用 现在有一个列表,其中包含如下信息 0111110, 1000001 因此,整个区块的运营日为1111111 我这里的问题是如何有效地合并行程以获得阻塞运行天数?您可以使用按位或: var x1 = Convert.ToByte("0111110", 2); var x2 = Convert.ToByte("1000001", 2); var foo = x1 | x2; var bar

我有一个字符串列表,它提供了以天为单位的旅行信息,例如011110表示旅行在一周的第一天和最后一天不可用

现在有一个列表,其中包含如下信息 0111110, 1000001

因此,整个区块的运营日为1111111

我这里的问题是如何有效地合并行程以获得阻塞运行天数?

您可以使用按位或:

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

var foo = x1 | x2;

var bar = Convert.ToString(foo, 2);
您可以使用按位或:

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

var foo = x1 | x2;

var bar = Convert.ToString(foo, 2);
使用嵌套循环:

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);
它比Kristofer的按位or更冗长,但如果要合并大量字符串,它应该非常快,因为一旦在特定位置生成1,它就会放弃。按位or方法有点幼稚,会导致更多不必要的转换。哪一个更有效可能取决于你的具体情况。按位方法也可能存在一些填充/长度问题,如果使用字节,则限制为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和嵌套循环恢复:

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);
它比Kristofer的按位or更冗长,但如果要合并大量字符串,它应该非常快,因为一旦在特定位置生成1,它就会放弃。按位or方法有点幼稚,会导致更多不必要的转换。哪一个更有效可能取决于你的具体情况。按位方法也可能存在一些填充/长度问题,如果使用字节,则限制为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恢复。假设您不能使用与提供的字符串不同的类型,您可以将结果复制到数组中,并从中创建字符串:

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);

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

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

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);
    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");
        }
    }
这是有效的,因为您只有两个分配—数组和字符串,七次迭代/比较,最多七个字符副本。

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

    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");
        }
    }
    var combined= input1.Zip
        (
            input2, 
            (a,b) => a == '1' ? a : b
        ); 
这将为您提供一个可枚举的字符,您可以使用字符串的构造函数将其生成一个新字符串

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
您可以使用一些简单的逻辑来组合字符串

    var combined= input1.Zip
        (
            input2, 
            (a,b) => a == '1' ? a : b
        ); 
这将为您提供一个可枚举的字符,您可以使用字符串的构造函数将其生成一个新字符串

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

简单的答案是使用正确的数据结构而不是字符串。简单的答案是使用正确的数据结构而不是字符串。