如何从每次运行的类似项目中选择最后一个值?

Col*_*nic 6 .net c# linq ienumerable

我有一份清单.我想从每次类似元素的运行中获取最后一个值.

我的意思是什么?让我举一个简单的例子.鉴于单词列表

['golf','hip','hop','hotel','grass','world','wee']

并且相似性函数"以相同的字母开头",该函数将返回较短的列表

['golf','hotel','grass','wee']

为什么?原始列表包含1个G字,3个H字,1个G字和2个W字.该函数返回每次运行的最后一个单词.

我怎样才能做到这一点?


假设的C#语法(实际上我正在使用客户对象,但我想分享一些你可以运行并自己测试的东西)

> var words = new List<string>{"golf", "hip", "hop", "hotel", "grass", "world", "wee"};
> words.LastDistinct(x => x[0])
["golf", "hotel", "grass", "wee"]
Run Code Online (Sandbox Code Playgroud)

编辑:我试过,.GroupBy(x => x[0]).Select(g => g.Last())但是给了''草','酒店',' 我',这不是我想要的.仔细阅读示例.


编辑.另一个例子.

['apple','armies','black','beer','bastion','cat','cart','able','art','bark']

这里有5次跑步(一次A跑,一次B跑,一次C跑,一次的A跑,一次的B跑).每次运行的最后一个词是:

['军队','堡垒','推车','艺术','树皮']

重要的是要理解每次运行都是独立的.不要在开始时将A的运行与A的运行混合在一起.

Col*_*nic 0

我和

/// <summary>
/// Given a list, return the last value from each run of similar items.
/// </summary>
public static IEnumerable<T> WithoutDuplicates<T>(this IEnumerable<T> source, Func<T, T, bool> similar)
{
    Contract.Requires(source != null);
    Contract.Requires(similar != null);
    Contract.Ensures(Contract.Result<IEnumerable<T>>().Count() <= source.Count(), "Result should be at most as long as original list");

    T last = default(T);
    bool first = true;
    foreach (var item in source)
    {
        if (!first && !similar(item, last))
            yield return last;

        last = item;
        first = false;
    }

    if (!first)
        yield return last;
}
Run Code Online (Sandbox Code Playgroud)