// 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查询?
答案 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>>
类型的虚拟数据源,因为词典不允许重复键。
然后删除重复项是直截了当的:
获取每个组合集的第一个结果
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添加排序,现在我已经正确订购了套装: - )
感谢您对此解决方案的评论。