0

我有一个长度为 1000 的字符串。我需要拆分它并将其分配给不同的控件。我没有任何字符分隔符。
由于我分配给控件的每个字符串都不包含相同的长度。到目前为止,我正在使用指定长度的子字符串来执行此操作。但它对我来说变得很忙,因为长度很大。

请建议我有没有办法以更简单的方式拆分和分配?

4

2 回答 2

2

您可以使用此字符串构造函数

 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);
 }
于 2013-07-15T12:15:27.980 回答
1

您将无法指定哪个控件获取字符串的哪个部分的信息。一旦有了这些信息(假设它们存储在控制数组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属性的同一基类。如果不是这种情况,您可能需要在循环内进行一些类型检查和强制转换。

于 2013-07-15T12:32:30.253 回答