【问题标题】:Join keys in key-value pair list with close value c#将键值对列表中的键与关闭值 c#
【发布时间】:2023-03-21 12:01:01
【问题描述】:

我有一个 的键值对列表。我想用具有接近值(+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
Original Original The Original Burger 原创汉堡:42

是否有任何算法可以遍历这些项目并通过合并具有接近值的键并将每个项目添加到列表来构造字符串?

【问题讨论】:

  • 请以适当的结构显示数据,以便可以使用您提供的代码运行它,minimal reproducible example。这样人们就可以更轻松地帮助您获得正确的输出,而无需转录文本图片。
  • 感谢反馈,我这里有点新手,想学习一下栈溢出的动态

标签: c# .net dictionary key-value


【解决方案1】:

你可以简化这个逻辑:

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

【讨论】:

  • 我将“GetPlusOrMinus3”方法的输入更改为键值对列表,效果非常好。谢谢 ! ` foreach (KeyValuePair kvp in wordslist) { var resultvalue = GetPlusOrMinus3(wordslist, kvp.Value); var resultString = String.Join(" ", resultvalue); safetextlist.Add(resultString); } safetextlist=safetextlist.Distinct().ToList(); foreach (var item in safetextlist) { richTextBox1.AppendText("\n" + item); }`
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多