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

RosedaleRdはまだ2回リストに含まれていることに注意してください。アイデアは、隣り合っている重複を削除することです。この場合、アイテム4、5、6、および7を削除します。

アイテム1はアイテム3の隣にないため、削除されません。

アップデート:

辞書が注文されていないことを心配する必要はありません。順番に並んでいるリストの解決策は問題ありません。ご注文を承ります。すなわち

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

2 に答える 2

2

標準の組み込みLINQ演算子を使用する方法は次のとおりです。

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

辞書から値を選択する前に、キーで並べ替えることを想定しています。

于 2012-05-17T03:59:19.600 に答える
2

代わりにソートされた辞書(または他のソートされた構造)を使用していると仮定すると、2つのオプションがあります。

リアクティブエクステンションを活用する

MicrosoftのReactiveExtensionsを利用する場合、これは非常に簡単です(誰もがそうすべきです!):

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<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 に答える