我有一个长度为 1000 的字符串。我需要拆分它并将其分配给不同的控件。我没有任何字符分隔符。
由于我分配给控件的每个字符串都不包含相同的长度。到目前为止,我正在使用指定长度的子字符串来执行此操作。但它对我来说变得很忙,因为长度很大。
请建议我有没有办法以更简单的方式拆分和分配?
您可以使用此字符串构造函数:
var input = "Some 1000 character long string ...";
var inputChars = input.ToCharArray();
control1.Value = new string(inputChars, 0, 100); // chars 0-100 of input
control2.Value = new string(inputChars, 100, 20); // chars 100-120 of input
control3.Value = new string(inputChars, 120, 50); // chars 120-170 of input
...
或使用Substring
:
var input = "Some 1000 character long string ...";
control1.Value = input.Substring(0, 100); // chars 0-100 of input
control2.Value = input.Substring(100, 20); // chars 100-120 of input
control3.Value = input.Substring(120, 50); // chars 120-170 of input
你也可以这样做
var parts = new []
{
Tuple.Create(0, 100),
Tuple.Create(100, 20),
Tuple.Create(120, 50),
}
var inputParts = parts.Select(p => input.Substring(p.Item1, p.Item2))
.ToArray();
control1.Value = inputParts[0];
control2.Value = inputParts[1];
control3.Value = inputParts[3];
随着控件数量的增加,这使得维护变得更加容易。您可以静态存储此“部件”列表,以便可以在应用程序的其他地方重用它,而无需复制代码。
如果所有控件的类型相同,则可以这样做:
var parts = new []
{
new { control = control1, offset = 0, length = 100 },
new { control = control2, offset = 100, length = 20 },
new { control = control3, offset = 120, length = 50 },
}
foreach(var part in parts)
{
part.control.Value = new string(inputChars, part.offset, offset.length);
// or part.control.Value = input.Substring(part.offset, offset.length);
}
您将无法指定哪个控件获取字符串的哪个部分的信息。一旦有了这些信息(假设它们存储在控制数组controls
和 int 数组length
中),您就可以遍历字符串并分段执行Substring
:
var controls = { control1, control2, control3, ... };
var lengths = { 100, 20, 5, ... };
int offset = 0;
for (int i = 0; i < controls.length; i++) {
controls[i].Value = myLongString.Substring(offset, lengths[i]);
offset += lengths[i];
}
显然,如果myLongString
小于 all 的总和lengths
或 的数组长度lengths
小于 的一个,这将严重失败controls
,但是为此添加一些检查并抛出适当的错误留给读者作为练习。此外,控件必须兼容,因为它们都派生自具有共同Value
属性的同一基类。如果不是这种情况,您可能需要在循环内进行一些类型检查和强制转换。