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不知道可以使用该格式填充字符串。又好又简单