2009-07-01 7 views
0

Ich habe ein Wörterbuch-Objekt IDictionary<string, string>, die nur die folgenden Elemente hat: Item1, Items2 und Item3. Jeder Artikel hat nur eine maximale Länge von 50 Zeichen.Wie lange Strings in feste Array-Elemente aufgeteilt werden

Ich habe dann eine Liste von Wörtern List<string>. Ich brauche eine Schleife, die die Wörter durchgeht und sie zu dem Wörterbuch hinzufügt, das bei Item1 beginnt, aber vor dem Hinzufügen zu dem Wörterbuch muss die Länge überprüft werden. Wenn der neue Artikel und die aktuelle Artikellänge zusammen mehr als 50 Zeichen enthalten, muss das Wort in die nächste Zeile (in diesem Fall Artikel 2) verschoben werden.

Was ist der beste Weg, dies zu tun?

+0

also möchten Sie uns Ihren Algorithmus und Code schreiben? –

+0

hinzugefügt das Tag, aber Sie fragen nach einem Algorithmus zum Einfügen von harten Word-Wraps. – Jimmy

+0

Ich brauche nur ein Beispiel Code. – dnoxs

Antwort

6

Ich bin mir nicht sicher, warum diese Frage wurde so niedergestimmt viel, aber vielleicht der Grund ist, dass Sie einen sehr klaren Algorithmus bereits, so sollte es trivial sein, die C# -Code zu erhalten. Wie es aussieht, entweder bist du entweder wirklich unerfahren oder wirklich faul. Ich werde das erstere annehmen.

Wie auch immer, lassen Sie uns durch die Anforderungen gehen.

1) "Ich habe dann eine Liste von Wörtern Liste." Du hast diese Linie schon in irgendeiner Form.

List<string> words = GetListOfWords(); 

2) „die Worte gehen und fügen Sie sie in dem Wörterbuch bei element1 Start“ - ich würde eine Liste anstelle einem Wörterbuchs empfehlen, wenn Sie für eine Folge von Strings gehen. Außerdem benötigen Sie eine temporäre Variable, um den Inhalt der aktuellen Zeile zu speichern, weil Sie wirklich nach dem Hinzufügen einer ganzen Zeile auf einmal sind.

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

3) „Ich brauche eine Schleife, die durch die Worte gehen“

foreach(var word in words) { 

4) „Wenn das neue Element und das aktuelle Element der Länge addiert größer als 50 Zeichen“ - +1 für den Raum.

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

5) „dann muss das Wort in die nächste Zeile nach unten bewegen“

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

6) „durch die Worte gehen und fügen Sie sie in element1 dem Wörterbuch Start“ - Sie didn Das sage ich sehr deutlich. Was Sie meinten, war, dass Sie jedes Wort mit der letzten Zeile verbinden möchten, es sei denn, die Zeile würde 50 Zeichen überschreiten.

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

und los gehts.


Wenn Sie unbedingt brauchen es als IDictionary mit 3 Linien, tun nur

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

Im Moment habe ich diese und mich gefragt, ob es vielleicht eine bessere Lösung war:


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

Ich würde nur Folgendes tun und tun, was Sie wollen mit den resultierenden "Linien"

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; 
    } 
Verwandte Themen