在键值对列表中加入具有接近值的键 c#

Join keys in key-value pair list with close value c#

我有一个 的键值对列表。我想用具有接近值 (+3-3) 的键合并并构造一个新字符串,并将每个新字符串添加到列表中。

这是我的列表的键和值:
鲁格:9
汉堡:9
乐: 21
鸽子: 21
汉堡:21
汉堡包:25
双: 30
动物:31
样式:31
该:43
原文:43
汉堡:44

这是我想要实现的输出:

路格汉堡
鸽子汉堡
汉堡
双兽风
原味汉堡

为此,我首先创建了一个包含此键值对的列表。并遍历每个项目并尝试找到接近的值,将它们分配给新的键值对并删除该索引。但这不能正常工作。这是到目前为止的代码:

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
双双动物:30
汉堡汉堡:31
原创 原创 The 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);

哪个会写出来:

one: 1, two: 2, four: 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