我有一个字符串列表,其中提供了有关几天内工作的信息,例如“ 0111110”表示一周的第一天和最后一天不提供旅行。
现在有一个包含信息的列表,例如 “ 0111110”, “ 1000001”
因此整个区块的营业日为“ 1111111”。
我的问题是如何有效合并行程以获取大块运行时间?
答案 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
答案 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");
}
}