当前位置: 首页 > 知识库问答 >
问题:

将键-值对列表中的键与关闭值C#连接

季俭
2023-03-14

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

以下是我的列表中的关键字和值:
鲁格尔:9
汉堡:9
乐:21
鸽子:21
汉堡:21
汉堡:25
双倍:30
动物:31
风格:31
风格:43
原始:43
汉堡:44

下面是我想要实现的输出:

Luger汉堡
Le Bigeon汉堡
汉堡
双兽风格
原味汉堡

为了实现这一点,首先我创建了一个包含这个键值对的列表。并尝试查找接近的值,将它们分配给新的键值对,然后删除该索引。但这并不正常。这就是到目前为止的代码:

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
原味原味汉堡原味汉堡:42

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

共有2个答案

文彭祖
2023-03-14

您可以简化此逻辑:

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
韦安怡
2023-03-14

一般来说,在迭代列表时,不能添加或删除列表中的项。换句话说,您不能在foreach一个列表的同时更改该列表。

尝试将要保留的项目添加到新列表中。

 类似资料:
  • 这似乎是一个简单的问题,但我一直无法解决它或找到任何解决办法。 如何反序列化: 进入对象列表:

  • 问题内容: 我正在编写一个Spark应用程序,并且想要将一组键-值对组合为一个“键-多值”对。我觉得我应该可以使用带有某种风味的功能来做到这一点: 发生这种情况时出现的错误是: ‘NoneType’对象没有属性’append’。 我的键是整数,值V1,…,Vn是元组。我的目标是用键和值列表(元组)创建一对。 问题答案: 映射和ReduceByKey 输入类型和输出类型必须相同,因此,如果要聚合列表

  • 我花了一段时间才弄明白这一点,我想分享我的解决方案。当然欢迎改进。 参考:在RDD中展平Scala映射,通过反转groupby(即,为其中的每个序列重复标题)来展平序列 我有一个RDD的形式:RDD[(Int,List[(String,List[(String,Int,Float)])]] 关键字:Int 值:List[(String,List[(String,Int,Float)])] 目标是将

  • 在处理redis时,是键不是键之间有很重要的区别。 键是数据库中数据片段(可以是String,List,Hash或任何其他redis数据类型)的独一无二的名称。 键永远不会被解释为…好吧,任何东西:它们只是惰性名称。 此外,当处理集群或分片系统时,它是定义包含此数据的节点(或者如果有从节点的节点)的关键 - 因此键对于路由命令是至关重要的。 这与 值 形成对比; 值是单独(对于字符串数据)或分组对

  • 问题内容: 我有一堂课 并希望将其序列化为 如何实现此目标(以及如何反序列化为对象? 我正在尝试使用 但显然最终会引号过多。 也不起作用,因为它不能创建足够的报价。 问题答案: 我发现了一种使用JsonSerializer的方法: 本类需要了解这一点: 反序列化非常相似: 这也需要在Foo类上进行注释:

  • 我肯定这是一个愚蠢的问题,但我找不到一个简单的方法将一个列表按另一个列表分组。我在网上搜索了很多,但我只找到了带有类属性或排序元素的示例。 我有一个带有键的字符串列表,例如: 和一个我想按键列表分组的int列表,例如: 因此结果应该是一个包含子列表的列表,如下所示: 或者也可以得到指数。提前道谢。

  • 因此,我有一个hashmap ,它存储每个字符串的arraylist。但是当我用ArrayList的新值添加另一对时,其他键值将被替换。因此,不同键的所有值都是相同的。 添加的第一个键: 对于第二个键,列表中有不同。但是,当添加第二个键(在put()方法之后)时,第一个键的值已经被替换。

  • 问题内容: 假设您有一个非常简单的数据结构: …并且您想将其中一些存储在javascript变量中。如我所见,您有三个选择: 如果您要存储(或希望可能拥有)多个“价值”部分(例如,增加他们的年龄等),显然第二或第三种选择是可行的,因此,为了论证,让我们假设在此结构中再也不需要任何数据值了。您选择哪一个,为什么? 编辑 :该示例现在显示最常见的情况:非顺序ID。 问题答案: 每个解决方案都有其用例。