删除字典中的重复项

如果我有这样的字典,

Dictionary roadNames = new Dictionary(); roadNames.Add(1, "Rosedale Rd"); roadNames.Add(2, "Transmere Rd"); roadNames.Add(3, "Rosedale Rd"); roadNames.Add(4, "Rosedale Rd"); roadNames.Add(5, "Rosedale Rd"); roadNames.Add(6, "Rosedale Rd"); roadNames.Add(7, "Rosedale Rd"); roadNames.Add(8, "Brown Rd"); roadNames.Add(9, "Harold Rd"); 

是否有LINQ解决方案来删除彼此相邻的重复项。 我之后的结果是一个包含这个的列表,

 Rosedale Rd Transmere Rd Rosedale Rd Brown Rd Harold Rd 

请注意,Rosedale Rd仍然在列表中两次。 想法是删除彼此相邻的重复项,在这种情况下,我们将删除项目4,5,6和7。

第1项不在第3项旁边,因此不会删除。

更新:

不要担心词典没有被订购。 按顺序排列的列表的解决方案没问题。 我可以处理订购。 即

 List roadNames = new List() { "Rosedale Rd", "Transmere Rd", // etc }; 

假设您正在使用排序字典(或任何其他排序结构),有两个选项。

利用Reactive Extensions

如果您利用Microsoft的Reactive Extensions (每个人都应该这样做),这非常简单:

 roadNames.Values // remove if a list instead .ToObservable() .DistinctUntilChanged() .ToList(); 

如果您愿意,可以将最终的ToList()更改为ToEnumerable()

返回:

 Rosedale Rd Transmere Rd Rosedale Rd Brown Rd Harold Rd 

使用扩展方法

您可以使用GroupAdjacent扩展方法:

 roadNames.Values // remove if a list instead .GroupAdjacent((x,y) => x == y) .Select(x => x.First()); 

扩展方法:

 public static IEnumerable> GroupAdjacent( this IEnumerable source, Func adjacent) { var g = new List(); foreach (var x in source) { if (g.Count != 0 && !adjacent(g.Last(), x)) { yield return g; g = new List(); } g.Add(x); } yield return g; } 

这是一个使用标准内置LINQ运算符的方法:

 var result = roadNames .OrderBy(x => x.Key) .Select(x => x.Value) .Aggregate( new List(), (xs, x) => { if (xs.LastOrDefault() != x) { xs.Add(x); } return xs; }); 

在假设从字典中选择值之前,我假设您要按键排序。