2009-07-01 80 views
0

我有一個字典對象IDictionary<string, string>,它只包含以下項目: Item1,Items2和Item3。每個項目的最大長度爲50個字符。如何將長字符串拆分爲固定數組項目

然後我有一個單詞列表List<string>。我需要一個循環來遍歷單詞並將它們添加到從Item1開始的字典中,但在將其添加到字典之前,需要檢查長度。如果新項目和當前項目的長度加在一起大於50個字符,則該單詞需要向下移動到下一行(在本例中爲Item2)。

這樣做的最好方法是什麼?

+0

所以你想讓我們寫你的算法和代碼? – 2009-07-01 14:49:26

回答

6

我不知道爲什麼這個問題得到了非常多的投票,但也許原因是你有一個非常明確的算法,所以它應該是微不足道的C#代碼。就目前而言,要麼你沒有經驗,要麼真的很懶惰。我將假設前者。

不管怎麼說,讓我們一起來看看需求。

1)「然後我有一個單詞列表。」你已經有了某種形式的這條線。

List<string> words = GetListOfWords(); 

2)「經過的話,將它們添加到開始項目1字典」 - 我推薦一個列表,而不是一本字典的,如果你要的字符串的序列。另外,您需要一個臨時變量來存儲當前行的內容,因爲您一次只添加一行完整行。

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)「經過的話,將它們添加到開始項目1字典」 - 你沒這句話很清楚。你的意思是你想把每個單詞加入最後一行,除非它使行數超過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] : ""; 
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; 
} 
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; 
    } 
相關問題