2009-07-01 21 views
0

辞書オブジェクトIDictionary<string, string>には、 Item1、Items2、Item3という項目しかありません。各項目の最大長は50文字です。長い文字列を固定配列の項目に分割する方法

私は単語のリストList<string>を持っています。単語を通ってItem1から始まる辞書に追加するループが必要ですが、辞書に追加する前に長さを確認する必要があります。新しい項目と現在の項目の長さが合計で50文字を超える場合、単語は次の行(この場合はItem2)に移動する必要があります。

これを行うにはどのような方法が最適ですか?

+0

あなたはアルゴリズムとコードを記述しますか? –

+0

はタグを追加しましたが、ハード・ワード・ラップを挿入するアルゴリズムを求めています。 – Jimmy

+0

サンプルコードが必要です。 – dnoxs

答えて

6

なぜこの質問が投票されたのか分かりませんが、おそらく理由は非常に明確なアルゴリズムがあるため、C#コードを取得するのは簡単なことです。それが立てば、あなたは本当に経験の浅い人か、本当に怠け者かです。私は前者を仮定します。

とにかく、要件を順守しましょう。

1)「私は単語リストのリストを持っています。あなたはすでに何らかの形でこの行を持っています。

List<string> words = GetListOfWords(); 

2)「という言葉を通過し、アイテム1から始まる辞書に追加」 - あなたは文字列のシーケンスのためのつもりなら、私は、代わりに、辞書のリストをお勧めします。また、一度にフルラインを追加した後には、現在の行の内容を格納するために一時変数が必要になります。

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

3「一緒に追加された新しいアイテムと現在の項目の長さが50文字よりも大きい場合」))

foreach(var word in words) { 

4「私は言葉を通過しますループを必要とします」 - スペースの+1。

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

5)

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

6)「という言葉を通過し、アイテム1から始まる辞書に追加」「その単語が次の行まで移動する必要がある」 - あなたはdidnのこれは非常にはっきりしています。あなたが意味したのは、行が50文字を超えない限り、各単語を最後の行に結合したいということでした。

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

などがあります。あなたは絶対にばかり

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

を行い、3行とのIDictionaryとしてそれを必要とする場合


私は現在、これを持っているし、おそらくよりよい解決策があった場合には思っていた:


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; 
    } 
関連する問題