4

如果我有这样的字典,

Dictionary<int, string> roadNames = new Dictionary<int, string>();

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 旁边,因此不会被删除。

更新:

不要担心字典没有被订购。有序列表的解决方案会很好。我可以处理订单。IE

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

2 回答 2

2

Here's a method that uses the standard built-in LINQ operators:

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

I've assumed that you want to order by key before selecting the value from the dictionary.

于 2012-05-17T03:59:19.600 回答
2

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

利用响应式扩展

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

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

如果您愿意,您可以将 final 更改ToList()为 to 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<IEnumerable<T>> GroupAdjacent<T>(
    this IEnumerable<T> source, Func<T, T, bool> adjacent)
{
    var g = new List<T>();
    foreach (var x in source)
    {
        if (g.Count != 0 && !adjacent(g.Last(), x))
        {
            yield return g;
            g = new List<T>();
        }
        g.Add(x);
    }
    yield return g;
}
于 2012-05-17T03:34:17.230 回答