如何将长字符串拆分为固定数组项

时间:2009-07-01 14:47:27

标签: c# algorithm

我有一个字典对象IDictionary<string, string>,它只有以下项目: Item1,Items2和Item3。每个项目的最大长度为50个字符。

然后我有一个单词列表List<string>。我需要一个循环来遍历单词并将它们添加到从Item1开始的字典中,但在将它添加到字典之前需要检查长度。如果新项目和当前项目的长度加在一起大于50个字符,则该单词需要向下移动到下一行(在本例中为Item2)。

最好的方法是什么?

3 个答案:

答案 0 :(得分:6)

我不确定为什么这个问题被拒绝了,但也许原因是你已经有了一个非常清晰的算法,所以获得C#代码应该是微不足道的。就目前而言,无论是你真的缺乏经验还是非常懒惰。我将假设前者。

无论如何,让我们逐步完成要求。

1)“然后我有一个单词列表列表。”你已经以某种形式拥有这条线。

List<string> words = GetListOfWords(); 

2)“仔细检查并将它们添加到从Item1开始的字典” - 如果您要使用一系列字符串,我建议使用List而不是字典。此外,您需要一个临时变量来存储当前行的内容,因为您确实是在一次添加完整行之后。

var lines = new List<string>();   
string currentLine = "";

3)“我需要一个循环,将通过单词”

foreach(var word in words) {

4)“如果新项目和当前项目的长度加在一起大于50个字符” - 这个空格为+1。

    if (currentLine.Length + word.Length + 1 > 50) {

5)“那么这个词需要向下移动到下一行”

        lines.Add(currentLine);
        currentLine = word;    
    }

6)“通过单词并将它们添加到从Item1开始的字典” - 你没有非常清楚地说出这一点。你的意思是你想把每个单词加到最后一行,除非它会使这行超过50个字符。

    else {
        currentLine += " " + word;   
    }
}
lines.Add(currentLine); // the last unfinished line

然后你去。


如果您绝对需要它作为带有3行的IDictionary,请执行

var dict = new Dictionary<string,string>();
for(int lineNum = 0; lineNum < 3; lineNum ++)
    dict["Address"+lineNum] = lineNume < lines.Length ? lines[lineNum] : "";

答案 1 :(得分:0)

我目前有这个,并且想知道是否有更好的解决方案:


public IDictionary AddWordsToDictionary(IList words)
{
    IDictionary addressParts = new Dictionary();
    addressParts.Add("Address1", string.Empty);
    addressParts.Add("Address2", string.Empty);
    addressParts.Add("Address3", string.Empty);

    int currentIndex = 1;
    foreach (string word in words)
    {
        if (!string.IsNullOrEmpty(word))
        {
            string key = string.Concat("Address", currentIndex);
            int space = 0;
            string spaceChar = string.Empty;
            if (!string.IsNullOrEmpty(addressParts[key]))
            {
                space = 1;
                spaceChar = " ";
            }
            if (word.Length + space + addressParts[key].Length > MaxAddressLineLength)
            {
                currentIndex++;
                key = string.Concat("Address", currentIndex);
                space = 0;
                spaceChar = string.Empty;
                if (currentIndex > addressParts.Count)
                {
                    break; // To big for all 3 elements so discard
                }
            }

            addressParts[key] = string.Concat(addressParts[key], spaceChar, word);
        }
    }

    return addressParts;
}

答案 2 :(得分:0)

我会做以下操作,并使用生成的“行”

执行您喜欢的操作
    static List<string> BuildLines(List<string> words, int lineLen)
    {
        List<string> lines = new List<string>();
        string line = string.Empty;
        foreach (string word in words)
        {
            if (string.IsNullOrEmpty(word)) continue;

            if (line.Length + word.Length + 1 <= lineLen)
            {
                line += " " + word;
            }
            else
            {
                lines.Add(line);
                line = word;
            }
        }
        lines.Add(line);
        return lines;
    }