C# 根据c中的长度动态构建字符串#
我的目标是生成一个C# 根据c中的长度动态构建字符串#,c#,stringbuilder,C#,Stringbuilder,我的目标是生成一个字符串。它有以下条件 首先,我将获取一个空字符串,并根据长度开始构建该字符串 例如: 我有一个空字符串” 在第一步中,我想添加一个字符串直到8个字符,这意味着首先我的字符串是”,然后直到8个字符,我的字符串应该包含值Hiwor,因此最后我的字符串将是Hiwor,如果没有值,则应在字符串中填充空值 在第二步中,我想将字符串meena添加到10个位置,因此我的最后一个字符串应该是Hiwor-meena。这样,我想构建我的字符串。我能做到这一点吗。你能帮帮我吗 样本: 初始字符串“”
字符串
。它有以下条件
首先,我将获取一个空字符串,并根据长度开始构建该字符串
例如:
我有一个空字符串
”
在第一步中,我想添加一个字符串
直到8个字符,这意味着首先我的字符串
是”
,然后直到8个字符,我的字符串应该包含值Hiwor
,因此最后我的字符串将是Hiwor
,如果没有值,则应在字符串中填充空值
在第二步中,我想将字符串meena
添加到10个位置,因此我的最后一个字符串应该是Hiwor-meena
。这样,我想构建我的字符串。我能做到这一点吗。你能帮帮我吗
样本:
初始字符串“”
第一步添加字符串到8个位置
所以最后一个字符串应该是Hiwor
第二步添加字符串meena
直到10个职位
所以最后一个字符串应该是Hiwor-meena
直到现在我都是这样试的
Dictionary<string, Int16> transLine = new Dictionary<string, Int16>();
transLine.Add("ProductCode", 1);
transLine.Add("ApplicantFirstName", 12);
transLine.Add("ApplicantMiddleInitial", 1);
transLine.Add("partner", 1);
transLine.Add("employee", 8);
List<string> list = new List<string>();
list.Add("grouplife");
list.Add("meena");
list.Add("d");
list.Add("yes");
list.Add("yes");
StringBuilder sb = new StringBuilder();
foreach (var listItem in list)
{
foreach (var item in transLine)
{
if (listItem == item.Key)
{
var length = item.Value;
sb.Insert(length, item.Key);
}
}
}
Dictionary transLine=新字典();
增加(“产品代码”,1);
加上(“申请人姓名”,12);
加上(“申请人姓名首字母”,1);
加上(“合伙人”,1);
加上(“雇员”,8);
列表=新列表();
列表。添加(“grouplife”);
列表。添加(“meena”);
列表。添加(“d”);
列表。添加(“是”);
列表。添加(“是”);
StringBuilder sb=新的StringBuilder();
foreach(列表中的var listItem)
{
foreach(易位中的var项目)
{
if(listItem==item.Key)
{
变量长度=项目值;
sb.插入(长度、项目、键);
}
}
}
但它给我带来了一个异常。索引超出了范围。必须为非负数且小于集合的大小。
首先定义StringBuilder的扩展方法:
public static class StringBuilderExtensions
{
public static void AppendPadded(this StringBuilder builder, string value, int length);
{
builder.Append($"{value}{new string(" ", length)}".Substring(0, length));
}
public static void AppendPadded(this StringBuilder builder, int value, int length);
{
builder.Append($"{new string("0", length)}{value}".Reverse().ToString().Substring(0, length).Reverse().ToString());
}
}
然后使用:
StringBuilder builder = new StringBuilder();
builder.AppendPadded("Hiwor", 8);
builder.AppendPadded("meena", 10);
return builder.ToString();
或者以你的例子:
foreach (string item in list)
builder.AppendPadded(item, transLine[item]);
编辑:好的,看起来您希望能够定义一种格式,然后使用它构建字符串。尝试:
(为此,您需要参考System.ComponentModel.DataAnnotations和System.Reflection)
要读取字符串以获取项目,请执行以下操作:
MyItem item = AnItem.CreateFromPaddedString<MyItem>(paddedString);
MyItem item=AnItem.CreateFromPaddedString(paddedString);
首先,我想对您的异常情况多说几句:
索引超出范围。必须为非负数且小于集合的大小
正如例外情况已经说过的那样。问题是您希望访问新的StringBuilder sb
中不存在的位置
StringBuilder sb = new StringBuilder();
// length: 1 and item.Key: ProductCode
sb.Insert(length, item.Key);
在这一行之后,新的sb
为空。里面没有一个字符。因此,您只能访问位于0
位置的索引。但几乎在每个循环的第一次内部迭代中,您都希望将索引1
作为目标,并尝试将字符串插入不存在的位置1
StringBuilder sb = new StringBuilder();
// length: 1 and item.Key: ProductCode
sb.Insert(length, item.Key);
那么如何解决这个问题呢。您可以使用String.Format()中的功能,也可以使用C#6中的字符串插值功能
例如:
foreach (string item in list)
builder.AppendPadded(item, transLine[item]);
String.Format()
var sb = new StringBuilder(string.Empty); // sb: []
sb.Append(string.Format("{0, -8}", "Hiwor")); // sb: [Hiwor ]
sb.Append(string.Format("{0,-10}", "meena")); // sb: [Hiwor meena ]
C#6字符串插值
var sb = new StringBuilder(string.Empty); // sb: []
sb.Append($"{"Hiwor", -8}"); // sb: [Hiwor ]
sb.Append($"{"meena", -10}"); // sb: [Hiwor meena ]
// ...
针对您的编辑:
对于给定的列表项,您将永远无法获得与任何字典键的匹配。“Hiwor”有5个字符,“Hiwor meena”有12个字符。那么,你的例子中的8和10是从哪里来的呢?你还可以提到你迄今为止为实现它所做的工作吗?你被困在哪里了?那么?你的“问题”中没有问题。你有什么问题?@Thomas如果没有绳子,就必须用空的空格填充。到目前为止,你试过什么?未完成的问题得到未完成的答案。检查字符串生成器:已更新。注意:您的长度将导致数据被修剪。您可以在设置值时使用.ToString,也可以删除GetPaddedString中的字符串异常,并在AppendPadded调用中使用property.GetValue(this).ToString()。不确定编译器是否会抱怨对int使用StringLength属性。我想解决另外一个问题,我想解决相反的问题,这意味着我想根据上面提到的每个属性的长度,将上述生成的字符串拆分为若干部分。你能帮我解决这个问题吗。添加了CreateFromPaddedString方法。通过将属性获取和设置移动到单独的方法并添加到整数处理中,也进行了整理。如果需要处理更多类型,您可以轻松地扩展GetPropertyValue和SetPropertyValue方法。嗨,Steve,我还面临一个以上问题,当我使用上述代码构建字符串时,我的值为0,字符串长度为7,就像“0”一样,表示只有1个位置填充了0剩余长度填充了emptyDidn不知道可以使用该格式填充字符串。又好又简单