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的运行混合在一起.
我和
/// <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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |