从字典中删除重复
本文关键字:删除 字典 | 更新日期: 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>>
类型的虚拟数据源,因为字典不允许重复的键。
然后直接删除重复项:
- 按键分组
- 按值长度排序
取每个组集的第一个结果
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);
我只按键添加排序,现在我已经正确排序了:-)
感谢您对这个解决方案的意见。