如何根据c#中的长度将字符串拆分为数组

时间:2012-07-26 05:58:23

标签: c# wcf

我真的被困在这里,并会感谢你的帮助。我创建了一个请求数据合同和一个服务的响应数据协定。请求DTO包含Cardnum,Id和Noteline1 ---- noteline18。响应DTO包含noteline1 - noteline18。

我将字符长度为100的字符串传递给请求数据成员noteLine1(数据长度为78个字符)。现在我想确保只有78个字符应该填入noteline1数据成员,其余的应该适合请求DTO的另一个空的noteline数据成员。我使用了以下代码,它对我来说很好:

string requestNoteReason = request.noteLine1;
if (response != null)
{
    foreach (PropertyInfo reqPropertyInfo in requestPropertyInfo)
    {
        if (reqPropertyInfo.Name.Contains("noteLine"))
        {
            if (reqPropertyInfo.Name.ToLower() == ("noteline" + i))
            {
                if (requestNoteReason.Length < 78)
                {
                    reqPropertyInfo.SetValue(request, requestNoteReason, null);
                    break;
                }
                else
                {
                    reqPropertyInfo.SetValue(request, requestNoteReason.Substring(0, 78), null);
                    requestNoteReason = requestNoteReason.Substring(78, requestNoteReason.Length - 78);
                    i++;
                    continue;
                }
            }
        }
    }
    goto Finish;
}

现在我想要包含超过78个字符长度的字符串的noteline1应该拆分并填入下一个空的直线。如果字符串长度超过200个字符,那么它应该拆分字符串并将其填入下一个连续的空字符串中。例如,如果字符串需要3个空的直线空间,那么它应该只填充下一个连续可用的空直线中的剩余字符串。(即noteline2,noteline3,noteline4)并且不应该用已经填充的字符串填充noteline以前填过。

请帮忙

1 个答案:

答案 0 :(得分:1)

[TestFixture]
public class Test
{
    [Test]
    public void TestLongLength()
    {
        var s = new string('0', 78) + new string('1', 78) + new string('2', 42);
        var testClass = new TestClass();
        FillNoteProperties(s, testClass);

        Assert.AreEqual(new string('0', 78), testClass.NoteLine1);
        Assert.AreEqual(new string('1', 78), testClass.NoteLine2);
        Assert.AreEqual(new string('2', 42), testClass.NoteLine3);
    }

    public static void FillNoteProperties(string note, TestClass testClass)
    {
        var properties = testClass.GetType().GetProperties();
        var noteProperties = (from noteProperty in properties
                              where noteProperty.Name.StartsWith("NoteLine", StringComparison.OrdinalIgnoreCase)
                              orderby noteProperty.Name.Length, noteProperty.Name
                              select noteProperty).ToList();                
        var i = 0;
        while (note.Length > 78)
        {
            noteProperties[i].SetValue(testClass, note.Substring(0, 78), null);
            note = note.Substring(78);
            i++;
        }

        noteProperties[i].SetValue(testClass, note, null);
    }
}