从Dictionary中删除重复项

时间:2015-07-20 07:21:00

标签: c# linq dictionary

      // 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查询?

3 个答案:

答案 0 :(得分:1)

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

// 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);

答案 1 :(得分:1)

如果Mark Shevchenkos回答说没有出于任何原因漂浮你的船,如果你愿意,你可以很好地按照长度排序。

我创建了一个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();
    

答案 2 :(得分:0)

非常感谢你的解决方案。

我找到了下一个:

        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);

我只按Key添加排序,现在我已经正确订购了套装: - )

感谢您对此解决方案的评论。