我有一个字典对象IDictionary<string, string>
,它只有以下项目:
Item1,Items2和Item3。每个项目的最大长度为50个字符。
然后我有一个单词列表List<string>
。我需要一个循环来遍历单词并将它们添加到从Item1开始的字典中,但在将它添加到字典之前需要检查长度。如果新项目和当前项目的长度加在一起大于50个字符,则该单词需要向下移动到下一行(在本例中为Item2)。
最好的方法是什么?
答案 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;
}