问题描述
我有一个
以下是我列表的键和值:
卢格:9
汉堡:9
勒:21
鸽子:21
汉堡:21
汉堡:25
双:30
动物:31
风格:31
:43
原文:43
汉堡:44
这是我想要实现的输出:
Luger Burger
鸽子鸽
汉堡
双重动物风格
原始汉堡
要实现此目的,首先我创建了一个包含此键值对的列表。然后遍历每个项目,并尝试找到接近的值,将它们分配给新的键值对,然后删除该索引。但这不能正常工作。到目前为止,这就是代码:
for (int i = 0; i < wordslist.Count; i++)
{
for (int j = 0; j < wordslist.Count; j++)
{
if (wordslist[i].Value <= wordslist[j].Value + 3 && wordslist[i].Value >= wordslist[j].Value - 3)
{
wordslist.Add(
new keyvaluePair<string,int>(wordslist[i].Key + " " + wordslist[j].Key,wordslist[i].Value)
);
wordslist.RemoveAt(j);
}
}
wordslist.RemoveAt(i);
}
这不起作用并产生如下重复结果:
鸽子:21
风格:30
汉堡:30
Double Double Animal:30
汉堡汉堡:31
Original Original The Original Burger原始汉堡:42
是否有任何算法可以迭代这些项目并通过合并具有接近值的键并将每个项目添加到列表中来构造字符串?
解决方法
您可以简化此逻辑:
public IEnumerable<string> GetPlusOrMinus3(Dictionary<string,int> fullList,int checkNumber)
{
return fullList.Where(w => checkNumber <= w.Value + 3
&& checkNumber >= w.Value - 3)
.Select(s => $"{s.Key}: {s.Value}" );
}
字符串格式对您来说并不理想,但逻辑应该成立。
在使用中,您可以执行以下操作:
var forOne = GetPlusOrMinus3(values,1);
var resultString = String.Join(",",forOne);
Console.WriteLine(resultString);
哪个会写出来:
一:1,二:2,四:4
并遍历所有内容:
foreach(var entryValue in values.Values)
{
Console.WriteLine(String.Join(",GetPlusOrMinus3(values,entryValue)));
}
或者在不重用任何结果的情况下循环浏览任何东西:
var matchedNumbers = new List<int>();
foreach(var entryValue in values.Values)
{
var matchResults = values.Where(w => entryValue <= w.Value + 3 && entryValue >= w.Value - 3
&& !matchedNumbers.Contains(w.Value)).ToDictionary(x => x.Key,x => x.Value);
if (matchResults.Any())
{
matchedNumbers.AddRange(matchResults.Select(s => s.Value).ToList());
Console.WriteLine(String.Join(",GetPlusOrMinus3(matchResults,entryValue)));
}
}
日志:
one: 1,two: 2,four: 4
twelve: 12,10: 10,eleven: 11
six: 6