从字典中删除重复

本文关键字:删除 字典 | 更新日期: 2023-09-27 18:03:36

      // removing duplicities from Dictionary
        var removables = data.ToLookup(x => x.Value, x => x.Key)
            .SelectMany(x => x.Skip(1)).ToList();
        foreach (var key in removables)
            data.Remove(key);

下面的输入(数据)可以很好地工作:

102030;"http://xxx.yyy.com/102030.ashx"
102030;"http://xxx.yyy.com/102030_x.ashx"

102030;"http://xxx.yyy.com/102030_x.ashx"被移除。

但是当我输入这个

102030;"http://xxx.yyy.com/102030_x.ashx"
102030;"http://xxx.yyy.com/102030.ashx"

102030;"http://xxx.yyy.com/102030.ashx"被移除。但是我只需要删除包含"_"的项。

如何解决这个问题?是否可以按长度或调整linq查询对输入进行排序?

从字典中删除重复

如果你想跳过带下划线的元素,你不应该跳过第一个元素,而应该保留所有不带下划线的元素:

// smart removing duplicities from Dictionary
var removables = data.ToLookup(x => x.Value, x => x.Key)
                     .SelectMany(x => x.Where(y => !y.Key.Contains('_')).ToList();
foreach (var key in removables)
    data.Remove(key);

如果Mark shevchenko的答案出于某种原因没有让你浮想起来,你可以很好地按长度排序,如果你愿意的话。

我已经创建了List<KeyValuePair<int, string>>类型的虚拟数据源,因为字典不允许重复的键。

然后直接删除重复项:

  1. 按键分组
  2. 按值长度排序
  3. 取每个组集的第一个结果

    var source = new List<KeyValuePair<int, string>>() {
    new KeyValuePair<int,string>(102030, "http://xxx.yyy.com/102030.ashx"),
    new KeyValuePair<int,string>(102030, "http://xxx.yyy.com/102030_x.ashx"),
    new KeyValuePair<int,string>(102040, "http://xxx.yyy.com/102040_x.ashx"),
    new KeyValuePair<int,string>(102040, "http://xxx.yyy.com/102040.ashx"),
    new KeyValuePair<int,string>(102050, "http://xxx.yyy.com/102050.ashx"),
    new KeyValuePair<int,string>(102050, "http://xxx.yyy.com/102050_x.ashx"),
    new KeyValuePair<int,string>(102060, "http://xxx.yyy.com/102060_y.ashx"),
    new KeyValuePair<int,string>(102060, "http://xxx.yyy.com/102060.ashx")
    

    };

    source.GroupBy (s => s.Key)
          .Select(x => x.OrderBy (y => y.Value.Length))
          .Select (x => x.First())
          .Dump();
    
      <
    • LinqPad演示/gh><
    • CSharpPad演示/gh>

非常感谢您的解决方案。

我找到了下一个:

        var removables = dict.OrderBy(x => x.Key).ToLookup(x => x.Value, x => x.Key).SelectMany(x => x.Skip(1)).ToList();
        foreach (var key in removables)
            dict.Remove(key);

我只按键添加排序,现在我已经正确排序了:-)

感谢您对这个解决方案的意见。